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 可以生成它们。
正如你所说,这是一个语义错误/违反约束。
Constraints
- 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 可变引用,因此应该允许出现在左侧。
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 可以生成它们。
正如你所说,这是一个语义错误/违反约束。
Constraints
- 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 可变引用,因此应该允许出现在左侧。