这是C/C++中未定义的行为吗?

jam*_*jam 3 c c++ undefined-behavior

int x = 2;
int y = 5;

int z = x +++ y;

printf("%d",z);
Run Code Online (Sandbox Code Playgroud)

VC++和GCC都提供7作为输出.我的困惑在于,它可能是x ++ + y或x + ++ y.这个定义了吗?

Igo*_*nik 7

在C和C++中,词法分析的原则是,可以形成有效令牌的最长字符序列被视为一个(也称为"最大蒙克").所以x+++y被明确地解析为(x++) + y.

2.4 /(3.3) - 否则,下一个预处理标记是可以构成预处理标记的最长字符序列,即使这会导致进一步的词法分析失败.


hac*_*cks 6

根据最大munch规则编译器总是解释x +++ yx++ + y ,因此行为定义良好.

C11:6.4词汇元素:

P(4)

如果输入流已被解析为预处理标记,直到给定字符,则下一个预处理标记是可构成预处理标记的最长字符序列.[...]

P(6)

示例2程序片段x+++++y被解析为x ++ ++ + y违反增量运算符的约束,即使解析x ++ + ++ y可能产生正确的表达式.