工作,我有以下代码:这是为什么不printf()函数在C
int i=1;
printf((i==1)?" ":" " "hello");
printf(" " "hello");
而且我惊讶地看到,第一printf
只给出了一个空间,输出和第二printf
输出空间后面跟着字符串hello。我希望第一次输出像第二次输出。但是有什么我在这里失踪。请帮我这个...
工作,我有以下代码:这是为什么不printf()函数在C
int i=1;
printf((i==1)?" ":" " "hello");
printf(" " "hello");
而且我惊讶地看到,第一printf
只给出了一个空间,输出和第二printf
输出空间后面跟着字符串hello。我希望第一次输出像第二次输出。但是有什么我在这里失踪。请帮我这个...
字符串文字加盟是一个词汇特征,这意味着这样的:
(i==1) ? " " : " " "hello"
是一样的:
(i==1) ? " " : " hello"
现在应该是很明显的,为什么你得到你所得到的结果。
哦上帝..为什么不是我在想......非常感谢 –
i == 1
是真实的,所以三元运算符评估为两个选项中的第一个," "
。一点也不令人意外。
是的,我想奇怪的就像留下了字符串你好吗?:operator..thank你 –
由于在三元运算符(i==1
)中测试的条件评估为true,因此它会在?
之后立即返回表达式。
的ternary operator的语义是这样的:
test_something?if_true:not_true
你printf
语句的工作,因为它应该。
C自动将两个相邻的字符串文字组合在一起。
因此,你的参数到第二个printf:" " "hello"
被连接在一起成为" hello"
,然后正常打印出来。
其他答案已经解释了为什么你的第一个printf工作的方式,它应该是非常明显的。
您的困惑的根源是对何时进行拼接的误解。连接两个连续的字符串文字由编译器在编译时完成,而不是在运行时由程序完成。因此,解析第一个printf只有一种方法:两个字符串文字都属于表达式的“else”分支。您可以通过将i设置为零并观察输出来进行测试。
yes..in第一次printf在真实条件下有单个空间并且在假状态下它具有打印双空间,接着是打印字符串hello ....并且在第二个printf中单个空间后跟字符串hello .. –
这里真正的混乱可能是操作/操作符优先级问题的顺序。基于海报的问题,我假设在printf的第一次调用中有一组缺失的圆括号。 – reuben
括号,你假设哪部分? –