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

时间:2015-02-21 13:22:14

标签: c++ c undefined-behavior

int x = 2;
int y = 5;

int z = x +++ y;

printf("%d",z);

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

2 个答案:

答案 0 :(得分:7)

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

  

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

答案 1 :(得分:6)

根据最大munch规则编译器始终将x +++ y解释为x++ + y,因此行为已明确定义。

C11:6.4词汇元素:

P(4)

  

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

P(6)

  

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