C编程中,要求L值是语义错误还是语法错误?

In C programming, L-value required is a semantic error or syntax error?

1. int main(void) 
2. { 
3.   int a =5, b = 6, c; 
4.   a + b = c; // lvalue required error
5.   2 = a ;     //lvalue required error
6. } 

第4行和第5行代码是语法错误还是语义错误? 根据我的说法,这些行应该抛出语法错误,但我发现 Context Free Grammar 可以生成它们。

正如你所说,这是一个语义错误/违反约束。

来自C11 6.5.16p2

Constraints

  1. An assignment operator shall have a modifiable lvalue as its left operand.

C 语法描述不足以区分左值和非左值。

出现赋值运算符的实际产生式是C11 6.5.16p1:

unary-expression assignment-operator assignment-expression

并且 unary-expression 包括,除此之外,在括号中包含任何表达式的可能性。

所以一个遵循语法的简单解析器确实会为这些无效表​​达式生成正确的解析树,需要进一步分析以确定它们是否符合标准中的约束。

即使是最简单的情况,比如

foo = 5;

可能有效也可能无效 - 取决于 foo 是否是可修改的左值 是否可将 5 分配给可修改的值foo 的类型没有演员...


HOWEVER,有这么一件小事。制作

unary-expression assignment-operator assignment-expression

只允许左侧出现一元异常。它不允许 a + b 出现在未加括号的 LHS 上!我尝试过的所有 C 编译器(GCC、MSVC、clang)似乎都存在问题。可能是他们都使用了 C++ 语法,然后剔除了不可能的东西。在 C++ 中,

a + b

可以 return 可变引用,因此应该允许出现在左侧。