You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 22:46:00