使用字符串文字作为使用三元运算符的表达式的结果是否有效/建议?

Gre*_*ers 5 c conditional-operator string-literals

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

int x = 1;
printf(x == 1 ? "%d second elapsed" : "%d seconds elapsed", x);
Run Code Online (Sandbox Code Playgroud)

它编译得很好,所以我认为它很好(也因为它只是 if-else 块的语法糖),但如果有人有一些额外的见解,我将不胜感激,谢谢。

PS,我想 C++ 也是如此?

Ted*_*gmo 2

是的!

固执己见:在阅读了由编写内核、驱动程序和杂项的程序员编写的大量代码之后。通常被认为“好”的实用程序,我认为共识是“很好”。它不仅安全,而且易于阅读。

一个小的、不带偏见的注释:编译器可以使字符串文字重叠。如果你有两个字符串文字,"Hello world"并且"world"编译你的程序将完全优化,你可能会发现指向'w'in 的指针"world"实际上在"Hello world"字符串文字内,因为它们都是有效的、以 null 结尾的字符串。例子:

ptr1
 |
 V
 hello world\0
       ^
       |
      ptr2
Run Code Online (Sandbox Code Playgroud)

但是,该优化不能应用于像您这样的字符串,因为不同的部分位于字符串文字的中间。

因此我建议:

printf("%d second%s elapsed", x, x == 1 ? "" : "s");
Run Code Online (Sandbox Code Playgroud)

我的另一个观点是,这样做也更容易阅读。