C “printf”(printf)的语义`

C “printf”(printf)的语义`,c,C,我想知道下面的语句将在C中打印什么 printf("hello\n") || (printf("goodbye\n") || printf("world\n")); 我通常习惯于用“cout”来打印C语言中的内容。我也对这种方式使用的管道和双管道操作符感到困惑。谢谢大家! 它只打印“你好” #包括 #包括 main() { printf(“你好”)||(printf(“再见”)|| printf(“世界”)); } < p>第一, cOUT/CODE>是C++发明,从来没有回到C,永远不会

我想知道下面的语句将在C中打印什么

printf("hello\n") || (printf("goodbye\n") || printf("world\n"));
我通常习惯于用“cout”来打印C语言中的内容。我也对这种方式使用的管道和双管道操作符感到困惑。谢谢大家!

它只打印“你好”

#包括
#包括
main()
{
printf(“你好”)||(printf(“再见”)|| printf(“世界”));
}

<代码> < p>第一,<代码> cOUT/CODE>是C++发明,从来没有回到C,永远不会。< /P> 接下来,
printf
返回打印字符数,因此第一次调用返回非零

由于
|
是短路布尔或,因此不会执行以下
printf
-调用

|
是按位或,因此不是短路。之所以添加,是因为您正在讨论单管和@Leeor链接这样的问题。)

Endresult:
hello\n
已打印:5个字符+换行符(将被翻译,因为
stdin
是文本模式(Unixoids上的标识转换))

7.21.6.3 printf功能 概要

#include <stdio.h>
int printf(const char * restrict format, ...);
#包括
int printf(常量字符*限制格式,…);
说明
2
printf
函数相当于插入参数
stdout
fprintf
printf
的参数之前
返回值
3
printf
函数返回传输的字符数,如果 发生输出或编码错误

6.5.12按位包含或运算符 简介
[…]
约束条件
2每个操作数应具有整数类型。
语义
3通常的算术转换是在操作数上执行的。
4.
|
运算符的结果是操作数(即中的每一位)的按位包含或 当且仅当转换数据中至少有一个对应位时,才设置结果 已设置操作数)

6.5.14逻辑或运算符 简介
[…]
约束条件
2每个操作数应具有标量类型。
语义
3如果
|
运算符的任一操作数比较不等于0,则该运算符应产生1;否则, 收益率为0。结果的类型为
int

4与按位
|
运算符不同,
|
运算符保证从左到右求值;如果 计算第二个操作数时,第一个操作数的计算之间有一个序列点 和第二个操作数。如果第一个操作数比较不等于0,则第二个操作数为 未评估

它将打印:

hello\n
(即hello和换行符,而不是文字“\n”。)

printf
返回打印到控制台的字符数。
|
是一个短路“or”,意思是:做第一件事,如果第一件事返回“false”,则做下一件事。最后,返回您所做的任何事情是否返回“真”

在c语言中,如果int是除0以外的任何值,并且所有这三个
printf
调用的print超过0个字符,则int被视为“true”,因此它将运行第一个,返回(逻辑上等同于)true的值,因此它将停止该行的执行并转到下一行

当然,没有理由写这样的代码。。。有时有理由对具有副作用的函数(如打印到控制台)使用短路布尔运算符,但我想不出有什么理由需要对正在调用的函数传递常量的位置短路,并且您总是确切地知道将从中得到什么结果


另外,是的,正如所写的,由于在第二个printf之前有一个额外的开括号,所以存在编译错误。但是忽略这一点。

你有权使用c编译器吗?
可以使用c吗<代码> CUT<代码>是C++标准库的一部分,所以我怀疑你在CThey中打印代码会因为不平衡的括号而导致编译时错误。复制(其中一个交换逻辑/位,或者看起来)我很好奇为什么,如果你想知道“行是什么”,您的第一个回答不是尝试并查看。请注意,
我对管道和双管操作符感到困惑
-根据问题的前一个副本判断,第一个操作符应该是按位的…@Leeor:刚才看到了您链接的另一个问题。我以前从未见过它。这样做实际上更有意义。加了一点。
#include <stdio.h>
int printf(const char * restrict format, ...);