2012-06-30 20 views
3

工作,我有以下代码:这是为什么不printf()函数在C

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

而且我惊讶地看到,第一printf只给出了一个空间,输出和第二printf输出空间后面跟着字符串hello。我希望第一次输出像第二次输出。但是有什么我在这里失踪。请帮我这个...

+0

yes..in第一次printf在真实条件下有单个空间并且在假状态下它具有打印双空间,接着是打印字符串hello ....并且在第二个printf中单个空间后跟字符串hello .. –

+0

这里真正的混乱可能是操作/操作符优先级问题的顺序。基于海报的问题,我假设在printf的第一次调用中有一组缺失的圆括号。 – reuben

+0

括号,你假设哪部分? –

回答

8

字符串文字加盟是一个词汇特征,这意味着这样的:

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

是一样的:

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

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

+0

哦上帝..为什么不是我在想......非常感谢 –

2

i == 1是真实的,所以三元运算符评估为两个选项中的第一个," "。一点也不令人意外。

+0

是的,我想奇怪的就像留下了字符串你好吗?:operator..thank你 –

1

由于在三元运算符(i==1)中测试的条件评估为true,因此它会在?之后立即返回表达式。

ternary operator的语义是这样的:

test_something?if_true:not_true 

printf语句的工作,因为它应该。

2

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

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

其他答案已经解释了为什么你的第一个printf工作的方式,它应该是非常明显的。

1

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

相关问题