语言:C
如果输入0,bool表达式将输出0,否则将输出1。
根据上述声明,
情况1:
输入
#include <stdio.h>
#include <stdbool.h>
main()
{
int a = 1,
b = 2;
bool res = ((a == b) && ("your "));
printf("res = %d", res);
}
输出
res = 0
情况2:
输入
bool res = (!(a == b) && ("your "));
printf("res = %d", res);
输出
res = 1
情况3:现在我将priff函数添加到("您的"(
输入
bool res = ((a == b) && printf("your "));
printf("res = %d", res);
输出
res = 0 //adding printf doesn't change the output
情况4:输入
bool res = (!(a == b) && printf("your "));
printf("res = %d", res);
输出
your res = 1 // i expected just "res = 1" not "your res = 1"
打印功能是如何在CASE3中不执行而在CASE4执行的?
根据C标准(6.5.13逻辑AND运算符(
4不同于逐位二进制&运算符,&;运营商担保从左到右评价;如果计算第二个操作数,则存在第一次和第二次评估之间的序列点操作数如果第一个操作数比较等于0,则第二个操作数未计算操作数
在此声明中用作初始值设定项的表达式中
bool res = ((a == b) && printf("your "));
逻辑AND运算符的第一个操作数CCD_ 1的值为0。因此,作为printf
调用的第二个操作数不被求值,
另一方面,在这个表达式中用作声明中的初始值设定项
bool res = (!(a == b) && printf("your "));
则第一操作数CCD_ 3评估为1。因此,作为printf
调用的第二个操作数也被求值。
逻辑和运算符&&
的评估是短路评估。
考虑到A && B
,首先对A
进行了评价。当A
为真时,A && B
可以变为真,并且对(a == b)
0进行评估。当A
为假时,A && B
将永远不会为真,并且B
不会被求值。
现在看看实际案例。
在情况3(a == b) && printf("your ")
中,(a == b)
为假,因为a
(1(不等于b
(2(。因此,现在我们失去了表达式(a == b) && printf("your ")
变为真的所有机会,因此printf("your ")
不被评估。这意味着该功能未被执行。
在情况4!(a == b) && printf("your ")
中,!(a == b)
为真,因为(a == b)
为假。现在,表达式!(a == b) && printf("your ")
可以根据printf("your ")
的值变为真,因此对printf("your ")
进行求值并执行函数。
在情况3中:
这是由于编译器优化了语句。由于使用了括号,该语句将从左到右进行翻译和求值。第一个表达式是:(a==b(是false,因为a和b的值。编译器发现((a==b(&;printf("your"((总是会产生false。因此优化要求不为printf("your"(生成代码。我敢打赌,如果你在demode模式下编译它,你会看到预期的结果。
案例4的解释留给您自己。这是显而易见的。(提示注意运算符"!"、"&&"的优先级(
祝你好运。