在C语言中,如果a | |的一侧为真,逻辑运算符是否结束?

在C语言中,如果a | |的一侧为真,逻辑运算符是否结束?,c,C,在C中,有以下内容: return (abc(1) || abc(2)); 如果abc1==1返回true,则将调用abc2?否。标准保证,如果abc1返回true,则不会调用abc2 如果abc1返回false,则保证调用abc2 这与&&:如果您有abc1&&abc2,那么只有当abc1返回true时才会调用abc2,如果abc1返回false,则不会调用abc2 这背后的理念是: true OR whatever -> true false OR whatever -> wh

在C中,有以下内容:

return (abc(1) || abc(2));
如果abc1==1返回true,则将调用abc2?

否。标准保证,如果abc1返回true,则不会调用abc2

如果abc1返回false,则保证调用abc2

这与&&:如果您有abc1&&abc2,那么只有当abc1返回true时才会调用abc2,如果abc1返回false,则不会调用abc2

这背后的理念是:

true OR whatever -> true
false OR whatever -> whatever

false AND whatever -> false
true AND whatever -> whatever
这来自于

否。标准保证,如果abc1返回true,则不会调用abc2

如果abc1返回false,则保证调用abc2

这与&&:如果您有abc1&&abc2,那么只有当abc1返回true时才会调用abc2,如果abc1返回false,则不会调用abc2

这背后的理念是:

true OR whatever -> true
false OR whatever -> whatever

false AND whatever -> false
true AND whatever -> whatever

这来自于

不,不会。这是一种常见的流量控制机制:

对于a&&b,仅当a为真时才计算b;如果a为false,则整个表达式必然为false


对于a | | b,仅当a为false时才计算b;如果a为false,则整个表达式可能仍然为true。

不,它不会。这是一种常见的流量控制机制:

对于a&&b,仅当a为真时才计算b;如果a为false,则整个表达式必然为false

对于a | | b,仅当a为false时才计算b;如果a为false,则整个表达式可能仍然为true。

| |逻辑比较会中断进一步检查,而|位比较则不会

您还可以阅读:

| |逻辑比较会中断进一步的检查,而|位比较不会

你也可以读到:

如果abc1==1返回true,那么将调用abc2

不,不会的。这种行为称为短路。它是由C和C++标准保证的。 C11n1570,§6.5.13逻辑与运算符 与按位二进制&运算符不同,&&运算符保证从左到右求值;如果对第二个操作数求值,则两个操作数求值之间有一个序列点 第一个和第二个操作数。如果第一个操作数的比较值等于0,则不计算第二个操作数

重点是我的

这同样适用于| |运算符

如果abc1==1返回true,那么将调用abc2

不,不会的。这种行为称为短路。它是由C和C++标准保证的。 C11n1570,§6.5.13逻辑与运算符 与按位二进制&运算符不同,&&运算符保证从左到右求值;如果对第二个操作数求值,则两个操作数求值之间有一个序列点 第一个和第二个操作数。如果第一个操作数的比较值等于0,则不计算第二个操作数

重点是我的

这同样适用于| |运算符。

nop,仅当左语句为false时调用第二个abc2

nop,仅当左语句为false时调用第二个abc2

abc1为false时才会调用第二个abc2

根据C99规范,逻辑OR运算符表示

| |运算符保证从左到右求值;第一个操作数求值后有一个序列点。如果第一个操作数的比较结果不等于0,则不计算第二个操作数

只有当abc1为false时,才会调用abc2

根据C99规范,逻辑OR运算符表示

| |运算符保证从左到右求值;第一个操作数求值后有一个序列点。如果第一个操作数的比较结果不等于0,则不计算第二个操作数

在C语言中,逻辑| |运算符是从左到右测试的,这是有保证的。要使整个语句为true,任何条件都可以为true。所以| |一直从左向右,直到一个条件为真,然后停止或结束。所以不,如果abc1返回true,则不会调用abc2

与&&相反,它一直从左向右运行,直到一个条件为false或结束。

在C中,逻辑| |运算符从左向右进行测试,这是有保证的。要使整个语句为true,任何条件都可以为true。所以| |一直从左向右,直到一个条件为真,然后停止或结束。所以不,如果abc1返回true,则不会调用abc2


与&&相反,它一直从左向右运行,直到一个条件为false或结束。

否。这实际上是非常重要的,并且在标准中定义为从左向右计算逻辑运算符。如果可以在不进一步计算操作数的情况下确定值,则停止计算。至少我100%肯定是和或

这是一个非常重要的问题,因为操作数的计算不能通过顺序重组隐式并行化或优化,因为预期结果可能不同。


例如,在广泛的用例中,例如if*ptr&&ptr->number>other_number

No,运行时出现问题。这实际上是非常重要的,并且在标准中定义为逻辑运算符从左到右进行评估。如果可以在不进一步计算操作数的情况下确定值,则停止计算。至少我100%肯定是和或

这是一个非常重要的问题,因为操作数的计算不能通过顺序重组隐式并行化或优化,因为预期结果可能不同


例如,在诸如if*ptr&&ptr->number>other_number等广泛使用情形中的运行时问题。。。你用C++来标记它?为什么你在C中问…你把它标记为C++?