我有以下代码:
int i=1;
printf((i==1)?" ":" " "hello");
printf(" " "hello");
我很惊讶地看到第一个printf
只给出一个空格作为输出,第二个printf
输出一个空格,后跟字符串hello。在第一个的情况下,我期待像第二个这样的输出。但是这里有什么我想念的吗。请在这件事上给予我帮助 ...
字符串文字连接是一个词法特性,这意味着:
(i==1) ? " " : " " "hello"
与此相同:
(i==1) ? " " : " hello"
现在应该很明显为什么你会得到你得到的结果。
i == 1
为真,因此三元运算符计算为两个选项中的第一个," "
. 一点也不奇怪。
C 自动将两个相邻的字符串文字组合在一起。
所以你的第二个 printf: 的参数" " "hello"
被连接在一起成为" hello"
,然后正常打印出来。
其他答案已经解释了为什么您的第一个 printf 以它的方式工作,这应该很明显。
由于在三元运算符 ( i==1
) 中测试的条件计算结果为真,因此它在 . 之后立即返回表达式?
。
三元运算符的语义是这样的:
test_something?if_true:not_true
您的printf
陈述应有的作用。
您混淆的根源是对何时执行连接的误解。连接两个连续的字符串文字是由编译器在编译时完成的,而不是由您的程序在运行时完成的。因此,只有一种方法可以解析第一个 printf:两个字符串文字都属于表达式的“else”分支。您可以通过将 i 设置为零并观察输出来测试它。