总和+++我在C中的未定义行为?

时间:2014-11-18 10:31:16

标签: c language-lawyer undefined-behavior

我在不同的机器和不同的编译器上测试了这个,但是我给出了相同的输出:

int sum = 10, i = 5;
printf("%d", sum+++i);

这是C中明确定义或未定义的行为吗?

2 个答案:

答案 0 :(得分:12)

它定义明确。 sum+++i被解析为sum++ + i,结果为15(带有递增sum的副作用)。

  

C11§6.4词汇元素

     

如果输入流已被解析为预处理令牌,直到给定的字符,那么   下一个预处理令牌是最长字符序列,可以构成一个   预处理令牌。此规则有一个例外:标头名称预处理标记仅在#include预处理指令和#pragma指令内的实现定义位置中被识别。在这种情况下,可以是标题名称或字符串文字的字符序列被识别为前者。

以下是一个类似的例子:

  

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

答案 1 :(得分:5)

本声明

printf("%d", sum+++i);

对应

printf("%d", sum++ + i);

并且是一份结构良好的声明。没有任何未定义的行为。

输出

15

根据C标准(6.4词汇元素)

  

4如果输入流已被解析为预处理令牌,则为   给定的字符,下一个预处理标记最长   可构成预处理令牌的字符序列