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