为什么这不适用于c中的printf()

时间:2012-06-30 20:41:01

标签: c string printf

我有以下代码:

    int i=1;
    printf((i==1)?" ":"   " "hello");
    printf(" " "hello");

我很惊讶地看到第一个printf仅提供一个空格作为输出,第二个printf输出一个空格,后跟字符串 hello 。在第一个的情况下,我期待输出像第二个。但这里有什么我想念的东西。请帮帮我...

5 个答案:

答案 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设置为零并观察输出来测试它。