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
可能产生正确的表达式.
这个说法
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如果输入流已被解析为预处理标记,直到给定字符,则下一个预处理标记是可构成预处理标记的最长字符序列.