【发布时间】:2021-04-28 09:46:58
【问题描述】:
这是一个非常基本的问题,但我找不到明确的答案: 是否允许检查指针不为空并且 (&&) 在同一 if 语句中也检查其成员值之一?
改写:如果 f 为空,下例中条件的右侧部分是否也被评估?
我知道这适用于 VS 当前版本,但我需要知道的是 C++ 标准是否允许这样做(或者它是否是 UB)。 另外,如果我将其编写为 2 个单独的 if 以使其更具可读性,我可以期望编译器将其优化为单个 if 吗?
struct foo
{
bool bar;
};
void main(){
foo *f;
// DO THINGS
if (f != null && f->bar == true)
{
// DO THINGS
}
}
编辑:这个问题与this one 不同,因为这只是一个顺序问题并不明显:证明是当我用谷歌搜索我的问题时,我并没有以那个 SO 答案结束。
【问题讨论】:
-
这能回答你的问题吗? "IF" argument evaluation order? TL;DR 是正确的,标准规定评估顺序是从左到右
-
"Also, if I write it as 2 separate if to make it more readable, can I expect the compiler to optimize it into a single if?"-- 这个问题没有意义,因为编译器发出的指令不使用if语句。您可以合理地确定编译器不会关心您是使用一个还是两个if语句。如果您启用了编译器优化,它可能会生成相同的代码。 -
@pptaszni:部分是的,谢谢。安德烈亚斯:你说得对,我的意思是如果我的 2 个 if-s 被编译为 2 个条件跳转或只是 1...但你没看错,对吧?
标签: c++ language-lawyer