以下代码在C中是有效的/良好的实践吗?

int x = 1;
printf(x == 1 ? "%d second elapsed" : "%d seconds elapsed", x);

它编译得很好,所以我认为它很好(也因为它只是if-Else块的语法糖),但如果有人有更多的见解,我将不胜感激,谢谢.

另外,我想C++也是这样吧?

推荐答案

是!

固执己见:在费力阅读了由编写内核、驱动程序和杂项的程序员编写的大量代码之后.那些通常被认为是"好的"的公用事业项目,我想大家的共识是"很好".它不仅是安全的,而且还可以很容易地阅读.

一个小的,非固执己见的注意:允许编译器使字符串重叠.如果您有两个字符串文字,"Hello world""world",并且编译您的程序将完全优化,您可能会发现"world"中指向'w'的指针实际上在"Hello world"字符串文字范围内,因为它们都是有效的、以空结尾的字符串.

但是,这种优化不能应用于像您这样的字符串,因为不同的部分位于字符串文字的前middle位.

这意味着编译器必须为三元运算符存储两个完整的字符串,这并不比使用if语句更好.

因此,我建议:

printf("%d second%s elapsed", x, x == 1 ? "" : "s");

我的另一个观点是,这样做也会让它更容易阅读.

C++相关问答推荐

修改pGM使用指针填充2-D数组但不起作用

ATmega328P USART发送字符重复打印

当main函数调用被重构时,C函数给出错误的结果

如何解决C中的严格别名?

C语言中字符数组声明中的标准

C是否用0填充多维数组的其余部分?

C中的指针增量和减量(*--*++p)

为什么GDB/MI进程的FIFO循环中有read()阻塞

如何按顺序将所有CSV文件数据读入 struct 数组?

如何编写一个for循环来计算C中各项的总和?

ifdef __cplusplus中的整数文字单引号

处理EPOLL_WAIT中的接收数据和连接关闭信号

GCC奇怪的行为,有fork 和印花,有换行符和不换行符

覆盖读取函数,但当文件描述符为3或4时,我有问题

收到不兼容的指针类型警告,因为函数的返回不是空*,而是 struct 指针

为什么Linux无法映射这个PT_LOAD ELF段?

问题:C#Define上的初始值设定项元素不是常量

10 个字节对于这个 C 程序返回后跳行的能力有什么意义

C 中 struct 体自赋值是否安全?特别是如果一侧是指向 struct 的指针?

C 预处理器中的标记分隔符列表