Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
短路逻辑运算符是强制要求的吗?和评估顺序? < ANSI标准是否要求逻辑运算符短路,在C或C++中?< /P>_C++_C_Logical Operators_Short Circuiting_Operator Precedence - Fatal编程技术网

短路逻辑运算符是强制要求的吗?和评估顺序? < ANSI标准是否要求逻辑运算符短路,在C或C++中?< /P>

短路逻辑运算符是强制要求的吗?和评估顺序? < ANSI标准是否要求逻辑运算符短路,在C或C++中?< /P>,c++,c,logical-operators,short-circuiting,operator-precedence,C++,C,Logical Operators,Short Circuiting,Operator Precedence,我很困惑,因为我记得K&R的书中说你的代码不应该依赖于这些操作被短路,因为它们可能不会。有人能指出标准中说逻辑运算总是短路的地方吗?我最感兴趣的是C++,C的答案也很棒。 我还记得读到(不记得在哪里)没有严格定义求值顺序,因此您的代码不应该依赖或假设表达式中的函数将按特定顺序执行:在语句结束时,所有引用的函数都将被调用,但是编译器可以自由选择最有效的顺序 标准是否指明了该表达式的求值顺序 if( functionA() && functionB() && func

我很困惑,因为我记得K&R的书中说你的代码不应该依赖于这些操作被短路,因为它们可能不会。有人能指出标准中说逻辑运算总是短路的地方吗?我最感兴趣的是C++,C的答案也很棒。 我还记得读到(不记得在哪里)没有严格定义求值顺序,因此您的代码不应该依赖或假设表达式中的函数将按特定顺序执行:在语句结束时,所有引用的函数都将被调用,但是编译器可以自由选择最有效的顺序

标准是否指明了该表达式的求值顺序

if( functionA() && functionB() && functionC() ) cout<<"Hello world";

if(function()&&functionB()&&functionC())不能如果您信任维基百科:

[
&&
| |
]在语义上不同于按位运算符&和|,因为如果只能从左边确定结果,它们将永远不会计算右操作数

是的,它要求(评估顺序和短路)。在您的示例中,如果所有函数都返回true,则调用的顺序严格地从function到functionB再到functionC。像这样用的

if(ptr && ptr->value) { 
    ...
}
逗号运算符也一样:

// calls a, then b and evaluates to the value returned by b
// which is used to initialize c
int c = (a(), b()); 
有人说
&&&
的左右操作数之间以及
?:
(条件运算符)的第一个和第二个/第三个操作数之间是“序列点”。在这一点之前,所有副作用都会被完全评估。因此,这是安全的:

int a = 0;
int b = (a++, a); // b initialized with 1, and a is 1
请注意,逗号运算符不能与用于分隔事物的语法逗号混淆:

// order of calls to a and b is unspecified!
function(a(), b());
< > C++标准在<代码> 5.14/1 < /> >:

&&运算符从左向右分组。操作数都隐式转换为bool类型(第4条)。 如果两个操作数都为true,则结果为true,否则为false。与&、&&不同,从左到右 计算:如果第一个操作数为false,则不计算第二个操作数

5.15/1
中:

| |运算符从左到右分组。操作数都隐式转换为bool(第4条)。如果其任一操作数为true,则返回true,否则返回false。与|不同,| |保证从左到右的求值;此外,如果第一个操作数的计算结果为true,则不计算第二个操作数

它对这两个方面都说:

结果是一场闹剧。第一个表达式的所有副作用(除了临时性破坏(12.2))都发生在第二个表达式被评估之前

除此之外,
1.9/18

在计算每个表达式时

  • a&b
  • a|b
  • a?b:C
  • a、b
使用这些表达式(5.14、5.15、5.16、5.18)中运算符的内置含义,在第一个表达式求值后有一个序列点


直接来自好的老K&R:

C保证从左到右对
&&
|
进行评估-我们很快就会看到这种情况


短路评价和评价顺序,是C和C++中的一个强制性语义标准。 如果不是这样的话,像这样的代码就不是常见的习惯用法了

   char* pChar = 0;
   // some actions which may or may not set pChar to something
   if ((pChar != 0) && (*pChar != '\0')) {
      // do something useful

   }
C99规范第6.5.13节逻辑与运算符

(4) 。与按位二进制&运算符不同,&&运算符保证 从左到右评价;有一个 评估后的序列点 第一个操作数。如果第一个 操作数比较等于0,则 不计算第二个操作数

类似地,第6.5.14节逻辑或运算符

(4) 与按位|运算符不同|| 运算符从左到右 评价有一个序列点 经过第一次评估 操作数。如果第一个操作数比较 不等于0,第二个操作数为 未评估


<> P>类似的措辞可以在C++标准中找到。当跳棋注释另一个答案时,如果你重写& &或·^,那么两个操作数都必须在它成为一个常规函数调用时进行评估。

< P>是的,对于C(C++)标准中的运算符<代码> > < <代码>和<代码>和< /代码>,都需要短路和评估顺序。 C++标准说(C标准中应该有一个等价的条款):

1.9.18

在下列表达式的求值中

使用这些表达式中运算符的内置含义,在计算第一个表达式后有一个序列点(12)

<>在C++中有一个额外的陷阱:短路不强> > <强> >适用于过载操作符类型>代码> < <代码> > <代码> & & <代码> > < /P> 脚注12:如第5条所述,本段所示的操作员为内置操作员。当其中一个运算符在有效上下文中重载(第13条)从而指定用户定义的运算符函数时,表达式指定函数调用,操作数形成参数列表,它们之间没有隐含的序列点。

<>通常不推荐在C++中重载这些运算符,除非你有一个非常特殊的要求。您可以这样做,但它可能会破坏其他人代码中的预期行为,特别是如果这些运算符是通过实例化模板间接使用的,并且类型重载这些运算符。

请非常小心

对于基本类型,这些是快捷运算符

但如果您为自己的类或枚举类型定义这些运算符,它们就不是快捷方式。贝卡
a && b
a || b
a ? b : c
a , b