`printf(“…”)||的语义 printf(“…”)|| 的printf(“…”)`
我想知道以下语句将在C中打印出来的内容?
printf("hello\n") || (printf("goodbye\n") || printf("world\n"));
我通常习惯使用“cout”来打印C中的东西。另外,我对使用这种方式的管道和双管道操作员感到困惑。 谢谢!
首先, cout
是一个C ++发明,从来没有回到C,也永远不会。
接下来, printf
返回打印字符数,因此第一个调用返回非零值。
作为||
是短路布尔 – 或者,以下printf
-calls都不会完成。
( |
是按位 – 或者,因而不是短路。添加是因为你在讨论单个管道而且@Leeor链接了这样的问题。)
Endresult: hello\n
打印:5个字符+换行符(将被翻译,因为stdin
是文本模式(在Unixoids上的身份转换))。
7.21.6.3 printf函数
概要
#include
int printf(const char * restrict format, ...); 描述
2printf
函数等效于fprintf
,其参数stdout
插入到printf
的参数之前。
返回
3printf
函数返回传输的字符数,如果发生输出或编码错误,则返回负值。
6.5.12按位包含OR运算符
概要
[…]
约束
2每个操作数应具有整数类型。
语义
3通常的算术转换是在操作数上执行的。
4|
的结果 operator是操作数的按位包含OR(即,当且仅当设置了转换后的操作数中的至少一个相应位时,才设置结果中的每个位)。
6.5.14逻辑OR运算符
概要
[…]
约束
2每个操作数都应具有标量类型。
语义
3||
如果操作数的任何一个比较不等于0,则运算符应该为1; 否则,它产生0.结果类型为int
。
4与按位|
不同 运算符,||
运营商保证从左到右的评估; 如果评估第二个操作数,则在第一个和第二个操作数的评估之间存在一个序列点。 如果第一个操作数比较不等于0,则不计算第二个操作数。
它将打印:
hello\n
(即hello和换行符,而不是文字“\ n”。)
printf
返回打印到控制台的字符数。 ||
是一个短路“或”,这意味着:做第一件事,然后如果第一件事返回“假”,做下一件事。 最后,返回您所做的任何事情是否返回“true”。
在c中,如果int是除0之外的任何值,则int被认为是“true”,并且所有这三个printf
调用都打印超过0个字符,因此它将运行第一个,返回(逻辑上等于的值)true ,所以它将停止执行该行并进入下一行。
当然,没有理由编写这样的代码……有时候有理由使用具有副作用的函数的短路布尔运算符(比如打印到控制台),但我想不出一个原因你需要在你正在调用的函数传递常数的地方短路,你总是知道你会从中得到什么结果。
另外,是的,因为写了一个编译错误,因为在你的第二个printf之前有一个额外的开括号。 但忽略了这一点。
它只打印“你好”!
http://www.compileonline.com/compile_c_online.php
#include #include main() { printf("hello\n") || (printf("goodbye\n") || printf("world\n")); }