这段代码有序列点问题吗?

问题描述 投票:0回答:1
int update(int& x) {
    x = 10;
    return 8;
}

int main(int argc, const char *argv[]) {
    int x = 5, y = 6;
    (x < y ? x : y) = update(x);
}

上面的代码有序列点问题吗?编译器生成的代码能否先执行‘update’函数,然后根据条件运算符判断是否给x或y赋值?

c++ sequence point
1个回答
0
投票

首先,C++ 从 C++11 开始就没有序列点了。

从 C++17 开始,保证在

update(x)
之前调用
(x < y ? x : y)
,因此条件将使用新值。 (规则19

在 C++17 之前,未指定是否首先评估

update(x)
或条件(它们的顺序不确定),但这不是 UB。仅当函数调用内部没有冲突的计算时,才会触发 UB。 (规则10

© www.soinside.com 2019 - 2024. All rights reserved.