然后在 C++ 中的条件语句中

12

除了布尔“and”运算符之外,Ada还具有在if条件语句中使用的and then语句的良好特性。这允许在访问对象之前进行检查,例如检查对象是否为非空:

if Object /= null and then Object.Value > 5 then
   -- do something with the value
end if;

有没有一种方法可以在不使用嵌套的if的情况下表达出类似的行为?


2
只需使用 if ((obj != null) && (object.value > 5))。C++ 将从左到右进行评估,并在链中的第一个为 false 时停止评估 &&。 - skeller
1
and&& 运算符具有固定的求值顺序。 - JVApen
4
谢谢提供链接。在C++中,“and”对应于Ada语言的“and then”,我甚至不知道该如何编写“非短路与”操作符。;) - 463035818_is_not_a_number
1
@formerlyknownas_463035818 感谢您的评论。已将链接添加到问题中。 - NeoSer
1
为了防止短路,您可以将操作数的评估分配给两个不同命名的变量,然后对结果执行 and 操作。 - user2100815
显示剩余2条评论
1个回答

17

嗯,根据你的代码,在C++中Object不能为NULL,因为它似乎不是一个指针。如果它是一个指针,你可以这样说:

 if (Object && Object->Value > 5 ) {
       // do something
 }

C++中的&&运算符执行“短路求值” - 如果左侧操作数计算结果为false,则停止计算。


进一步说明Neil的答案,||运算符还实行短路计算。至于大多数其他运算符,操作数的求值顺序是未指定的。 - Dave
@Dave 逗号运算符和条件运算符也指定了求值顺序。还有 .-> 运算符。我相信还有其他我忘记的 :-) - user2100815
1
@NeoSer请确保不要使用&,因为它没有短路功能,您可能更喜欢使用别名and来避免混淆。 - Slava
2
为什么你说它似乎不是指针(或在Ada中称为访问值)?Ada可以轻松地拥有一个名为Object的访问类型变量:type Foo is access Bar; 然后 Object : Foo; - egilhh
2
扩展@egilhh的评论,Object.Value是一个合法的解引用,相当于Object.all.Value的简写。 - Simon Wright

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接