为什么 OR 语句只计算一个,即使两者都为真?[复制]

Why does the OR statement evaluate only one even if both are true? [duplicate]

提问人:Agile_Eagle 提问时间:9/15/2019 最后编辑:kameAgile_Eagle 更新时间:9/15/2019 访问量:100

问:

考虑以下 C 代码,根据我所学到的,OR 语句应该同时评估 printf。但在实际输出中,我只看到“XX”。为什么会这样?

#include<stdio.h>
int main() {
    int a;
    a = (printf("XX")||printf("YY"));
    printf("%d\n",a);
    a = (printf("XX")&&printf("YY"));
    printf("%d\n",a);
}

输出-

XX1 二十年1月

C 条件语句 布尔逻辑

评论

1赞 Eduardo Pascual Aseff 9/15/2019
这就是所谓的短路评估,如果第一个操作数为真,则整个操作也为真,因此没有必要评估第二个操作数
0赞 Agile_Eagle 9/15/2019
@EduardoPascualAseff知道了!我现在该怎么办?删除问题?
0赞 Eduardo Pascual Aseff 9/15/2019
@Agile_Eagle做你想做的事

答:

1赞 David Schwartz 9/15/2019 #1

假设您正在尝试回答这个问题“是下雨还是晚上 7 点之后?一旦你看到下雨,你就知道答案是“是”。您无需检查它是否在晚上 7 点之后。

a = (printf("XX")||printf("YY"));

你问了它一个“或”问题。一旦它评估了第一部分,它就知道你的问题的答案是肯定的,所以它没有必要评估第二部分。printf

2赞 Nithin Kumar Biliya 9/15/2019 #2

即使一个条件为 true,OR 运算符输出也为 true。在本例中,第一个语句返回 true。因此,无需计算 OR 算子的第二个操作数。printf

2赞 Mihir Luthra 9/15/2019 #3

||如果任何操作数为 true,则运算符的计算结果为 true。因此,如果第一个操作数的计算结果为它,则不会检查第二个操作数。如果第一个操作数为假,它只检查第二个操作数。true

&&运算符的计算结果仅当两个操作数均为 时为 。它会检查第二个操作数,如果第一个操作数不是。truefalse

手册页所述:

成功返回后,这些函数将返回打印的字符数(不包括用于结束字符串输出的空字节)。 函数 snprintf() 和 vsnprintf() 写入的字节数不超过 (包括终止的 null 字节 ('\0'))。如果输出由于此限制而被截断,则返回值是字符数(不包括终止的 null 字节),如果有足够的可用空间,该字符数将写入最终字符串。因此,大小或更大的返回值意味着输出被截断。(另请参阅下面的 NOTES。

假设您有一个这样的代码:

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("%d", printf(""));
    return 0;
}

这将按照手册页中的说明进行打印。0

如果您的陈述是:

printf("") && printf("XX");

它不会打印任何内容,因为第一个操作数的计算结果为 。0

printf("") || printf("YY");

会打印.YY

就您而言,

a = (printf("XX")||printf("YY"));

仅当第一个操作数无法打印任何内容时才进行评估。printf("YY")

a = (printf("XX")&&printf("YY"));

当两者都成功时会打印。XXYYprintf

1赞 AugustinLopez 9/15/2019 #4

如果左侧部分已确定为 true,则 OR 运算符不会计算其右侧部分。因为它不需要:是“总是”真的。即使潜在的崩溃隐藏在右侧。始终首先检查左侧部分。||TRUE || something

如果出现错误,printf 的返回值不是“false”:它返回 -1。“false”值为 0,如果您尝试打印空格式字符串或在其开头放置“\0”,则会出现这种情况。在一般情况下,任何非 0 的值都将被计算为“true”。