我得到的错误是"lvalue required as left operand of assignment"
。作为赋值左操作数所需的左值(C程序)
它分配给行:
if(ch=='.' || ch=='"' || ch=='(' || ch=')' || ch=='!' || ch==',' || ch=='?' || ch==';') { etc }
我只是想检查,如果我看的字符等于这些字符中的任何一个。有关修复的任何想法?
谢谢
我得到的错误是"lvalue required as left operand of assignment"
。作为赋值左操作数所需的左值(C程序)
它分配给行:
if(ch=='.' || ch=='"' || ch=='(' || ch=')' || ch=='!' || ch==',' || ch=='?' || ch==';') { etc }
我只是想检查,如果我看的字符等于这些字符中的任何一个。有关修复的任何想法?
谢谢
ch=')'
应该ch==')'
。您获得的特定错误的原因是因为虽然==
比||
更高的优先级,=
具有较低的优先级,所以这样的:
ch == '(' || ch = ')'
被解析为
((ch == '(') || ch) = ')'
正试图分配')'
到(ch == '(') || ch)
这是一个右值并且不可赋值的结果。这是一个常见的错误,并使用这种技术来避免:
if ('.' == ch || '"' == ch || ...)
注意,字符文字和变量皆已==
周围的地方。这样,如果你不小心键入了
if ('.' = ch)
你会得到一个编译器错误。
是的,我记得这个技巧......不知怎的,我无法自己去使用它,因为它读起来很不自然。我很高兴现代IDE在条件下检测到缺少'='符号! – dasblinkenlight 2011-12-20 02:20:35
@dasblinkenlight是啊,我不使用它,或者出于同样的原因,我只是推荐给人作为选项 – 2011-12-20 02:21:05
我不明白为什么'ch =')''应该导致OP的错误。 – Pubby 2011-12-20 02:21:20
你眼前的问题是,你正在使用=
(分配),而在==
(平等):
if(ch=='.' || ch=='"' || ch=='(' || ch=')' || ...
___^____
see here
发生了什么事是与各个位的相对优先级的事情。尽管==
将绑定在比||
更高的级别,a == b || c == d
评估为(a == b) || (c == d)
。
但是,=
不绑定在更高的级别,所以a == b || c = d
评估为((a == b) || c) = d)
。与您的代码,与一部分表达结束:
('(' || ch) = ')'
换句话说,你要分配')'
到非左值'(' || ch
。
你实际上没有parenthesising每学期(其中许多人做),因为这将使它很幸运有语法正确的,但不是你期望在运行什么:
if ((ch == '.') || (ch == '"') || (ch == '(') || (ch = ')') || ...
_________^^^^^^^^^^_________
will assign rather than test
通常的做法,以避免那就是把恒定的第一,但是,像你一样,我相信只是普通丑:
if (('.' == ch) || ('"' == ch) || ('(' == ch) || (')' = ch) || ...
^^^^^^^^
/urk! \
当我做那种事,我倾向于依靠关于标准库,使我的代码看起来更好,并有少得多的是不正确的机会:
if (strchr (".\"()!,?;", ch) != NULL) {
// It's valid.
}
甚至更好:
#define VALID_PUNCTUATION ".\"()!,?;"
if (strchr (VALID_PUNCTUATION, ch) != NULL) {
// It's valid.
}
或者甚至比这更好,把整个段的功能而只使用类似:
if (isValidPunctuation (ch)) {
// It's valid.
}
(你仍然必须确保代码在功能是正确的,但您主线代码会更清洁)。
哇多么愚蠢的错误!十分感谢大家。 – Ellea 2011-12-20 02:41:42