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行代码被认为是语法错误还是语义错误?根据我的说法,这些行应该会抛出语法错误,但我发现上下文无关语法可以生成它们。
正如您所说,这是一个语义错误/约束冲突。
来自C11 6.5.16p2
约束
赋值运算符的左操作数应为可修改的左值
C语法描述不足以区分左值和非左值。
分配运算符出现的实际生产是C11 6.5.16p1:
unary-expression assignment-operator assignment-expression
unary-expression
包括在括号中有任何表达式的可能性。
因此,一个遵循语法的简单解析器确实会为这些无效表达式生成正确的解析树,并且需要进一步分析它们是否符合标准中的约束。
即使是最简单的情况,如
foo = 5;
可能有效也可能无效-取决于foo
是否是可修改的左值和5
是否可分配给foo
类型的可修改值而不强制转换。。。
但是,有一件小事。生产
unary-expression assignment-operator assignment-expression
只允许左侧出现一元异常。它不允许a + b
出现在LHS上未加括号!我尝试过的所有C编译器(GCC、MSVC、clang(似乎都有一些可疑之处。他们可能都使用C++语法,然后剔除不可能的地方。在C++中,
a + b
可以返回可变引用,因此应该允许出现在左侧。