1

语言:C

如果输入 0,则布尔表达式输出 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

案例二:

输入

    bool res = (!(a == b) && ("your "));
    printf("res = %d", res);

输出

res = 1

案例3: 现在我将prinf函数添加到(“你的”)

输入

    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"

打印功能如何不在CASE 3中执行但在CASE 4中执行?

4

3 回答 3

2

根据 C 标准(6.5.13 逻辑与运算符)

4 与按位二进制 & 运算符不同,&& 运算符保证从左到右的求值;如果计算第二个操作数,则在第一个和第二个操作数的计算之间存在一个序列点。如果第一个操作数比较等于 0,则不计算第二个操作数。

在此声明中用作初始值设定项的表达式中

bool res = ((a == b) && printf("your "));

逻辑 AND 运算符的第一个操作数(a == b)的计算结果为 0。因此,第二个操作数是调用的printf不计算,

另一方面,在此表达式中用作声明中的初始值设定项

bool res = (!(a == b) && printf("your "));
 

第一个操作数的!(a == b)计算结果为 1。因此,调用的第二个操作数也被printf计算。

于 2021-01-11T17:18:50.203 回答
1

逻辑和运算符的评估&&短路评估

考虑到A && B,首先A进行评估。当A为真时,A && B可以变为真并被B评估。何时A为假,A && B永远不会为真,也不会被B评估。

现在来看实际案例。

在 CASE 3(a == b) && printf("your ")中,(a == b)是错误的,因为a(1) 不等于b(2)。(a == b) && printf("your ")因此,现在我们失去了表达式变为真的所有机会,因此printf("your ")不被评估。这意味着该函数未执行。

在 CASE 4!(a == b) && printf("your ")中,!(a == b)是真的,因为(a == b)是假的。现在表达式!(a == b) && printf("your ")可能会根据 的值变为真printf("your "),因此printf("your ")被评估并执行函数。

于 2021-01-11T16:11:39.297 回答
-2

在案例 3 中:

这是由于编译器优化了语句。由于使用了括号,语句从左到右翻译和评估。第一个表达式是: (a == b) 因为 a 和 b 的值而为假。编译器发现 ((a == b) && printf("your")) 中的表达式的结果总是会产生错误。因此优化要求不要为 printf("your") 生成代码。我敢打赌,如果你在 demode 模式下编译它,你会看到预期的结果。

案例4的解释留给你自己。这很明显。(提示注意运算符“!”、“&&”的优先级)

祝你好运。

于 2021-01-11T16:36:14.503 回答