Uri*_*Raz 1 c parsing operators token c-preprocessor
如果C必须编译以下代码
int a = 5, b = 3, c = 7;
a = b---c;
Run Code Online (Sandbox Code Playgroud)
难道要分析它a = b-- - c,a = b - --c或者是不确定的行为?
编译器考虑最长的字符序列来确定令牌。
所以这句话
a = b---c;
Run Code Online (Sandbox Code Playgroud)
相当于
a = b-- - c;
Run Code Online (Sandbox Code Playgroud)
也就是说,在赋值右侧的表达式中,存在后缀减量运算符,--后跟加法运算符-。
来自C标准(6.4词法元素)
4如果输入流已解析为最多给定字符的预处理令牌,则下一个预处理令牌是可以构成预处理令牌的最长字符序列。...
因此,执行此语句后的变量值将为
a = -4, b = 2, c = 7
Run Code Online (Sandbox Code Playgroud)
还请注意,括号中可能包含有效的子表达式。你可以写例如
a = ( b-- )-c;
Run Code Online (Sandbox Code Playgroud)
但你可能不会写
a = ( b- )--c;
Run Code Online (Sandbox Code Playgroud)
另一方面,您也可以写
a = b-( --c );
Run Code Online (Sandbox Code Playgroud)
在这种情况下,执行语句后的变量值将为
a = -3, b = 3, c = 6
Run Code Online (Sandbox Code Playgroud)