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

在C编程中,需要L值是语义错误还是语法错误?,c,syntax-error,language-lawyer,lvalue,C,Syntax Error,Language Lawyer,Lvalue,第四行和第五行代码被认为是语法错误还是语义错误? 据我所知,这些行应该抛出语法错误,但我发现上下文无关语法可以生成它们 正如您所说,这是一个语义错误/违反约束 从 约束条件 赋值运算符应具有可修改的左值作为其左操作数。 C语法描述不足以区分左值和非左值 分配运算符出现的实际产量为: 一元表达式包括在括号中包含任何表达式的可能性 因此,遵循语法的简单解析器确实将为这些无效表达式生成正确的解析树,需要进一步分析,以查看它们是否与标准中的约束匹配 即使是最简单的情况,比如 unary-expressi

第四行和第五行代码被认为是语法错误还是语义错误?
据我所知,这些行应该抛出语法错误,但我发现上下文无关语法可以生成它们

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

约束条件

赋值运算符应具有可修改的左值作为其左操作数。 C语法描述不足以区分左值和非左值

分配运算符出现的实际产量为:

一元表达式包括在括号中包含任何表达式的可能性

因此,遵循语法的简单解析器确实将为这些无效表达式生成正确的解析树,需要进一步分析,以查看它们是否与标准中的约束匹配

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

unary-expression assignment-operator assignment-expression
可能有效,也可能无效-取决于foo是否为可修改的左值,以及5是否可分配给foo类型的可修改值,而无需强制转换

然而,有一件小事。生产

foo = 5;
仅允许左侧出现一元异常。它不允许a+b出现在LHS Unpentensized上!我试过的所有C编译器,GCC、MSVC、clang,似乎都有点可疑。这可能是因为他们都使用C++文法,然后清除不可能的东西。在C++中,

unary-expression assignment-operator assignment-expression

可以返回可变引用,因此应允许显示在左侧。

正如您所说,这是一个语义错误/约束冲突

约束条件

赋值运算符应具有可修改的左值作为其左操作数。 C语法描述不足以区分左值和非左值

分配运算符出现的实际产量为:

一元表达式包括在括号中包含任何表达式的可能性

因此,遵循语法的简单解析器确实将为这些无效表达式生成正确的解析树,需要进一步分析,以查看它们是否与标准中的约束匹配

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

unary-expression assignment-operator assignment-expression
可能有效,也可能无效-取决于foo是否为可修改的左值,以及5是否可分配给foo类型的可修改值,而无需强制转换

然而,有一件小事。生产

foo = 5;
仅允许左侧出现一元异常。它不允许a+b出现在LHS Unpentensized上!我试过的所有C编译器,GCC、MSVC、clang,似乎都有点可疑。这可能是因为他们都使用C++文法,然后清除不可能的东西。在C++中,

unary-expression assignment-operator assignment-expression

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

我知道,先生和这两行是我怀疑的重点,如果我以与编译器抛出的错误相反的顺序写入它们。我已经在问题中添加了语言律师标签,这可以用来说明你对语言规范和语法感兴趣,而不是实际使用。一些喜欢触发的人可能会投反对票,因为他们认为你在问为什么代码不能编译。或者这可能与月亮的相位有关。。。有时没有充分的理由在你的问题中写更多的散文总是有帮助的。应该补充的是,语法错误和非语法错误的区别在语言律师和/或编译器生成之外相当模糊,诸如此类……我知道,先生和这两行是我怀疑的重点,如果我以相反的顺序写的话编译器会抛出哪个错误。我已经在问题中添加了语言律师标签,它可以用来告知您对语言规范和语法感兴趣,而不是实际使用。一些喜欢触发的人可能会投反对票,因为他们认为你在问为什么代码不能编译。或者这可能与月亮的相位有关。。。有时没有充分的理由在你的问题中写更多的散文总是有帮助的。应该补充的是,语法错误和非语法错误的区别在语言律师和/或编译器生成之外相当模糊,诸如此类……它帮助了我。非常感谢你的回答。你如何从这个结果中得出a+b=c?a+b当然不是一元表达式。类似地,b=c不是乘法表达式,因此它不能是+的运算符。的确,在一般情况下,提供的BNF语法不足以完全表达该约束。例如,a+b=c可以从语法派生,但违反了约束。但是a+b=c确实违反了语法。所以其中有些是句法上的。。。。也就是说,如果你采取一个非常严格的,可能是
正确理解在这种情况下的句法含义。就我个人而言,我认为各种约束都是语法上的。有些甚至是词汇,例如@rici-hmm,你可能是对的。这篇文章需要增加一个内容,这对我很有帮助。非常感谢你的回答。你如何从这个结果中得出a+b=c?a+b当然不是一元表达式。类似地,b=c不是乘法表达式,因此它不能是+的运算符。的确,在一般情况下,提供的BNF语法不足以完全表达该约束。例如,a+b=c可以从语法派生,但违反了约束。但是a+b=c确实违反了语法。所以其中有些是句法上的。。。。也就是说,如果你对这个上下文中的句法含义有一个非常僵化而且可能不正确的看法。就我个人而言,我认为各种约束都是语法上的。有些甚至是词汇,例如@rici-hmm,你可能是对的。需要在这个职位上增加一个职位。