gpt4 book ai didi

c++ - 在 C++17 中排序的移位操作数

转载 作者:IT老高 更新时间:2023-10-28 23:01:50 32 4
gpt4 key购买 nike

我阅读了 C++17 标准 $8.5.7.4:

The expression E1 is sequenced before the expression E2.

用于移位运算符。

还有 cppreference第 19 条规定:

In a shift operator expression E1<>E2, every value computation and side-effect of E1 is sequenced before every value computation and side effect of E2

但是当我尝试使用 gcc 7.3.0 或 clang 6.0.0 编译以下代码时

#include <iostream>
using namespace std;

int main() {
int i = 5;
cout << (i++ << i) << endl;
return 0;
}

我收到以下 gcc 警告:

../src/Cpp_shift.cpp: In function ‘int main()’:
../src/Cpp_shift.cpp:6:12: warning: operation on ‘i’ may be undefined [-Wsequence-point]
cout << (i++ << i) << endl;
~^~

叮当警告是:

warning: unsequenced modification and access to 'i' [-Wunsequenced]

我使用以下命令编译:

g++ -std=c++17 ../src/Cpp_shift.cpp -o Cpp_shift -Wall
clang++ -std=c++17 ../src/Cpp_shift.cpp -o Cpp_shift -Wall

我得到了预期的 320作为两种情况下的输出 ( 5 * 2 ^ 6 )

有人可以解释为什么我会收到此警告吗?我忽略了什么吗?我还阅读了this相关问题,但它没有回答我的问题。

编辑:所有其他变体++i << i , i << ++ii << i++导致相同的警告。

编辑2:(i << ++i)结果 320对于 clang (正确)和384对于 gcc(不正确)。如果 ++ 似乎 gcc 会给出错误的结果在 E2 , (i << i++)也给出了错误的结果。

最佳答案

标准中明确了移位运算符的操作数的求值顺序。

n4659 - §8.8 (p4):

The expression E1 is sequenced before the expression E2.

表达式 i++ << i 中没有未定义的行为, 定义明确。这是 Clang 中的一个错误和 GCC两者都有。

关于c++ - 在 C++17 中排序的移位操作数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51784836/

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