MS VS22等C++编译器处理复合下标表达式时出现运行时错误,是否为Bug?
关于C++下标表达式求值顺序的疑问
我写了一段用于测试下标运算符的混淆代码,我认为这段代码中的下标表达式符合C标准——*C17及以后标准明确规定:“表达式E1在表达式E2之前被求值”*。但即便使用支持最新C标准的MS VS22 C、gcc 8.3等编译器编译运行,仍会触发运行时错误。
代码示例如下:
#include <iostream> int main() { int a[] = { 1, 2, 3, 4, 5 }; for (const int *p = a; p != a + sizeof( a ) / sizeof( *a ); ++p) { std::cout << ( *p++ - 1 )[( --p, a )] << ' '; } std::cout << '\n'; }
或者使用C++20模块版本:
import std; int main() { int a[] = { 1, 2, 3, 4, 5 }; for (const int *p = a; p != a + std::size( a ); ++p) { std::cout << ( *p++ - 1 )[( --p, a )] << ' '; } std::cout << '\n'; }
请问这是编译器的Bug,还是我遗漏了C++标准中与下标表达式相关的重要内容?
内容的提问来源于stack exchange,提问作者Vlad from Moscow
相关产品推荐
相关产品推荐

