gpt4 book ai didi

c++ - 以下是未定义的行为吗?我 = 函数(我)

转载 作者:IT老高 更新时间:2023-10-28 21:45:17 31 4
gpt4 key购买 nike

我知道 i=i++; 是未定义的行为,因为 i 在序列点 ; 之前更改了两次。

但我不知道编译器是否保证以下情况不是未定义的行为:

int func(int &i)
{
i++;
return i;
}

int i = 1;
i = func(i);

最佳答案

首先,现代 C++ 已经从旧的(不充分的)“序列点”概念转换为“序列”的新概念(即“sequenced before”、“sequenced after”)。虽然 i = i++ 仍未定义,但 i =++i 现在实际上已完美定义。许多左值返回运算符中的排序规则被重新设计。

其次,您的版本在旧规范和新规范下都是安全的。函数内部对 i 的修改与外部对 i 的赋值安全地“隔离”。在经典规范序列中,函数开头和结尾的点安全地将 i 的修改(和读取)彼此分开。新的排序规则也保留了相同级别的保护。

说明函数调用提供的保护的示例如下所示

int inc(int &i) { return i++; }
...
int i = 1;

int r1 = i++ * i++ * i++;
// Undefined behavior because of multiple unsequenced side effects
// applied to the same variable

int r2 = inc(i) * inc(i) + inc(i);
// No UB, but order of evaluation is unspecified. Since the result
// depends on the order of evaluation, it is unspecified

int r3 = inc(i) + inc(i) + inc(i);
// Perfectly defined result. Order of evaluation is still unspecified,
// but the result does not depend on it

关于c++ - 以下是未定义的行为吗?我 = 函数(我),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42021369/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com