c语言 error c2106: "=": 左操作数必须为左值,需要左值作为赋值的左操作数(C程序)...

我收到错误"lvalue required as left operand of assignment"。

它分配给该行:

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是的,出于相同的原因,我也没有使用它,我只是向人们推荐它

@Pubby:可能是因为ch是const。

@Pubby @Xeo ==的优先级高于||,但是=的优先级较低。 因此,它被解析为(( || ch) = )

仅在SO上,这个常见错误至少已经出现了几次!

您的直接问题是您使用的是=(分配)而不是==(等于):

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。

实际上,您很幸运,没有在每个词条上加上括号(很多人都这样做了),因为这会使它在语法上正确,但在运行时却没有达到您的期望:

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.

}

(您仍然必须确保函数中的代码正确,但是您的主线代码会更简洁)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值