Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.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
C++ 如何';如果(甲)及"乙",;语句是否被评估?_C++ - Fatal编程技术网

C++ 如何';如果(甲)及"乙",;语句是否被评估?

C++ 如何';如果(甲)及"乙",;语句是否被评估?,c++,C++,问题是,如果A是错误的,该声明是否会立即转变为其他声明。B会被评估吗 当数组实际为空且包含零个元素时,我在检查数组索引的有效性时问这个问题,比如数组[0]。因此抛出一个segfault,因为我们正在尝试访问超出数组边界的内容。具体地 if( (A) && (B) ) { //do something } else //do something else 如果实际对数组[0]进行求值,则这可能是危险的,因为它在没有对“&&”左侧进行第一次检查的情况下对故障进行分段。优先权

问题是,如果A是错误的,该声明是否会立即转变为其他声明。B会被评估吗

当数组实际为空且包含零个元素时,我在检查数组索引的有效性时问这个问题,比如数组[0]。因此抛出一个segfault,因为我们正在尝试访问超出数组边界的内容。具体地

if( (A) && (B) )
{
  //do something
}
else
  //do something else

如果实际对数组[0]进行求值,则这可能是危险的,因为它在没有对“&&”左侧进行第一次检查的情况下对故障进行分段。优先权告诉我,左边肯定会优先,但它并没有告诉我如果左边是假,它不会正确的评价。

< P>在C和C++中,<代码> & & <代码>和<代码> <代码>操作符“短路”。这意味着它们仅在需要时计算参数。如果
&&
的第一个参数为false,或者
|
的第一个参数为true,则不会计算其余参数

您发布的代码是安全的,尽管我质疑您为什么要包含一个空的
else
块。

是的,如果((A)和&(B))在第一个子句中失败,如果(A)计算为false


顺便说一句,这适用于任何语言,而不仅仅是C派生语言。对于线程和并行处理,这是另一回事;)

您询问的是
&&
运算符,而不是
if
语句

&&&
,这意味着如果在工作时它满足了只产生一个答案的条件,它将停止工作并使用该答案

因此,
0&&x
将执行
0
,然后终止,因为无论调用
&&
的第二个参数是什么,表达式都无法计算非零

如果布尔语句的有效性可以在语句的一部分之后得到保证,则不计算其余部分


当某些语句有副作用时,这一点非常重要。

对于逻辑&&这两个参数都必须为true, 然后它将被输入if{}时钟,否则它将执行else{}。 对于逻辑| |,如果{},则参数或条件之一为true就足以执行

if( (array.GetElements() > 0) && (array[0]))
  array[0]->doSomething();
else
  //do nothing and return

不是所有的语言。有些语言,如VisualBasic,具有不会短路的逻辑运算符。我想指出,在引入“OrElse”和“AndAlso”之前,VB的情况已经很久没有出现过了。即使现在,“或”和“和”也不会短路。这是因为以前的逻辑和按位“或”与“和”运算符是相同的。有些语言,如Ada,有两个选项(“和”/“然后”和“或”/“或其他”)。@xcramps-短路布尔在大多数情况下都很方便,但它们是语言设计的选择。没有什么能让他们在任何情况下都成为更好的选择。假装他们是做事情的唯一方式是愚蠢和误导的。它们只是最常见的方法。@ StGrave:C++在调用函数之前计算所有操作数,即使该函数名为“运算符&”。因此这种重载不会短路。是的,我的评论不正确,改为//不做任何事情并返回,在本例中更准确。我想补充一点,如果在自己的类中重载运算符&&或| |,它们就不会短路了。要记住的东西。@Kristo,我不知道!然而,我不认为有任何理智的情况下,超载的运营商。重载boolcast操作符会更有用。@Kristo»这是意料之中的,对吧?编译器无法始终确定&&的特殊重载是否会导致副作用,因此为了安全起见,它会计算两个操作数。另一种规范形式是
if(p&&p->bar){}
。这也是安全的。如果你只是想“什么都不做,什么都不做,什么都不做”,你应该完全去掉“其他”这个词。否则,编译器会抱怨没有与else一起使用的语句(如果else是封闭块中的最后一个语句),或者更糟糕的是,使用下一条语句作为放入else块的语句。我尝试将注释用作占位符,这意味着:一些代码将转到此处,但这还不够重要,不能包含在我的例子中。实际情况是,有些代码在else的范围内返回,但也有在else的范围后返回的代码。希望这能把事情弄清楚
if( (A) && (B) ){
     //if A and B both are true
}else{
}
if( (A) ||(B) ){
     //if A or B is true 
}else{
}