3

我有以下代码:

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

我很惊讶地看到第一个printf只给出一个空格作为输出,第二个printf输出一个空格,后跟字符串hello。在第一个的情况下,我期待像第二个这样的输出。但是这里有什么我想念的吗。请在这件事上给予我帮助 ...

4

5 回答 5

8

字符串文字连接是一个词法特性,这意味着:

(i==1) ? " " : "   " "hello"

与此相同:

(i==1) ? " " : "   hello"

现在应该很明显为什么你会得到你得到的结果。

于 2012-06-30T20:44:49.993 回答
2

i == 1为真,因此三元运算符计算为两个选项中的第一个," ". 一点也不奇怪。

于 2012-06-30T20:43:19.120 回答
2

C 自动将两个相邻的字符串文字组合在一起。

所以你的第二个 printf: 的参数" " "hello"被连接在一起成为" hello",然后正常打印出来。

其他答案已经解释了为什么您的第一个 printf 以它的方式工作,这应该很明显。

于 2012-06-30T20:44:52.687 回答
1

由于在三元运算符 ( i==1) 中测试的条件计算结果为真,因此它在 . 之后立即返回表达式?

三元运算符的语义是这样的:

test_something?if_true:not_true

您的printf陈述应有的作用。

于 2012-06-30T20:44:42.913 回答
1

您混淆的根源是对何时执行连接的误解。连接两个连续的字符串文字是由编译器在编译时完成的,而不是由您的程序在运行时完成的。因此,只有一种方法可以解析第一个 printf:两个字符串文字都属于表达式的“else”分支。您可以通过将 i 设置为零并观察输出来测试它。

于 2012-06-30T20:48:52.903 回答