我在C ++中有一个if块,如下所示:
if( node != NULL && node->next !=NULL ){
//do some stuff
}
任何人都可以告诉我,我需要拆分节点和节点 - >接下来两个if块吗?或者是它 保证节点!= NULL将在node-> next!= NULL之前执行?
答案 0 :(得分:13)
这是short circuit评估和操作员&&保证在评估右侧之前完全评估左侧表达式
从标准来看:
5.14逻辑AND运算符[expr.log.and]
logical-and-expression: inclusive-or-expression logical-and-expression && inclusive-or-expression
- &&运营商组从左到右。该 操作数都在上下文中转换为bool(第4条)。该 如果两个操作数都为真,则结果为true,否则为false。不像 &,&&保证从左到右的评估:第二个操作数不是 评估第一个操作数是否为false。
- 结果是布尔。如果 评估第二个表达式,每个值计算和侧面 与第一个表达相关的效应在每个表达之前排序 值计算和与第二个相关的副作用 表达
醇>
答案 1 :(得分:2)
不,你没有。 &&
运算符短路;如果左操作数的计算结果为false,则根本不评估右操作数,因为结果已知。 (类似地,当左操作数为真时,||
运算符不会计算右操作数。)
答案 2 :(得分:0)
你不需要。 node!= NULL将首先执行,如果为false,则不会评估其余条件。
答案 3 :(得分:0)
如果第一个条件为假,则不会评估第二个条件,因为在任何情况下,完整表达式将等于假,而不考虑第二个条件的评估结果。
根据C ++标准
1&&操作员组从左到右。操作数都是 在上下文中转换为bool(第4条)。如果两者都是如此 操作数是真的,否则是假的。不像&,&&担保 从左到右的评估:第二个操作数是否被评估 第一个操作数是假的。