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

Kev*_*ong 2 c undefined-behavior language-lawyer

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

int sum = 10, i = 5;
printf("%d", sum+++i);
Run Code Online (Sandbox Code Playgroud)

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

Yu *_*Hao 12

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

C11§6.4词汇元素

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

并且遵循类似的示例:

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

  • @YuHao:重点是,即使你从未编译它,这个程序也是定义良好的.即使你在一个孤岛上写在纸上,它也会很好地形成具有可预测语义的C语言.为什么要剥夺我们这种见解? (2认同)

Vla*_*cow 5

这个说法

printf("%d", sum+++i);
Run Code Online (Sandbox Code Playgroud)

对应于

printf("%d", sum++ + i);
Run Code Online (Sandbox Code Playgroud)

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

输出将是

15
Run Code Online (Sandbox Code Playgroud)

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

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

  • @SouravGhosh作为一个特别的暗示:从俞昊那里读到答案,这是非常好的解释 (2认同)