这是C++中未定义的行为吗?

And*_*gia 4 c++ undefined-behavior

我想知道在这里的最后一个x中访问x是否是未定义的行为:

int f(int *x)
{
    *x = 1;
    return 1;
}

int x = 0;
if (f(&x) && x == 1) {
    // something
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*ani 13

不是未定义的行为,因为运算符&&是一个序列点

  • `&&`与`,`的运算符的行为不同,它也定义了一个序列点,但行为与`,`的行为不同.使`,`更令人困惑. (3认同)

Alo*_*ave 7

它定义明确.

参考 - C++ 03标准:

第5节:表达式,第4段:

除非注明[例如&&和||的特殊规则 ],单个运算符的操作数和各个表达式的子表达式的评估顺序以及副作用发生的顺序是未指定的.

而在,

第1.9.18节

在评估以下表达式时

a && b
a || b
a ? b : c
a , b
Run Code Online (Sandbox Code Playgroud)

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

  • 在运算符&&中明确指定(短路) (2认同)