C如何解析a = b --- c?

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-- - ca = b - --c或者是不确定的行为?

Vla*_*cow 7

编译器考虑最长的字符序列来确定令牌。

所以这句话

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)