2011-12-20 93 views
1

我得到的错误是"lvalue required as left operand of assignment"作为赋值左操作数所需的左值(C程序)

它分配给行:

if(ch=='.' || ch=='"' || ch=='(' || ch=')' || ch=='!' || ch==',' || ch=='?' || ch==';') { etc } 

我只是想检查,如果我看的字符等于这些字符中的任何一个。有关修复的任何想法?

谢谢

+0

哇多么愚蠢的错误!十分感谢大家。 – Ellea 2011-12-20 02:41:42

回答

10

ch=')'应该ch==')'。您获得的特定错误的原因是因为虽然==||更高的优先级,=具有较低的优先级,所以这样的:

ch == '(' || ch = ')' 

被解析为

((ch == '(') || ch) = ')' 

正试图分配')'(ch == '(') || ch)这是一个右值并且不可赋值的结果。这是一个常见的错误,并使用这种技术来避免:

if ('.' == ch || '"' == ch || ...) 

注意,字符文字和变量皆已==周围的地方。这样,如果你不小心键入了

if ('.' = ch) 

你会得到一个编译器错误。

+2

是的,我记得这个技巧......不知怎的,我无法自己去使用它,因为它读起来很不自然。我很高兴现代IDE在条件下检测到缺少'='符号! – dasblinkenlight 2011-12-20 02:20:35

+0

@dasblinkenlight是啊,我不使用它,或者出于同样的原因,我只是推荐给人作为选项 – 2011-12-20 02:21:05

+0

我不明白为什么'ch =')''应该导致OP的错误。 – Pubby 2011-12-20 02:21:20

0

你眼前的问题是,你正在使用=(分配),而在==(平等):

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. 
} 

(你仍然必须确保代码在功能是正确的,但您主线代码会更清洁)。

相关问题