首页 > 解决方案 > 布尔表达式中打印函数的行为

问题描述

语言: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中执行?

标签: cbooleanprintflogical-and

解决方案


根据 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计算。


推荐阅读