C - 无法找出此错误:"C2106: '=' : left operand must be l-value"



我正在使用Visual Studio 2013来尝试学习C语言。

我正在使用著名的K&R书,在将书中的以下代码复制并粘贴到Visual Studio 2013之后,我得到了错误:

1 错误 C2106:"=":左操作数必须是 l 值
2 智能感知:表达式必须是可修改的左值

#include <stdio.h>
#define IN 1 /* inside a word */
#define OUT 0 /* outside a word */
/* count lines, words, and characters in input */
main()
{
    int c, nl, nw, nc, state;
    state = OUT;
    nl = nw = nc = 0;
    while ((c = getchar()) != EOF) {
        ++nc;
        if (c == 'n')
            ++nl;
        if (c == ' ' || c == 'n' || c = 't')
            state = OUT;
        else if (state == OUT) 
            state = IN;
            ++nw;
    }
    printf("%d %d %dn", nl, nw, nc);
}

似乎错误来自以下语句:

if (c == ' ' || c == 'n' || c = 't')

但我真的想不出出了什么问题,更不用说代码直接来自书本的事实。

任何帮助将不胜感激!

谢谢!

if (c == ' ' || c == 'n' || c = 't')
//                             ^ Oops.

我建议你休息一下。即使不知道作业会尝试写入||的结果,因为它的优先级较低,这种差异也在尖叫。

if 的条件下将c = 't'更改为c == 't'。否则,条件表达式将被解析为

 if ( ((c == ' ' || c == 'n') || c) = 't')   

((c == ' ' || c == 'n') || c)是一个右值(布尔值;一个常量),它是不可分配的(就像1 = 2一样)。

您需要更改现有的

 c = 't'

 c == 't'

否则,由于 || 的优先级高于 = ,您的代码将像

 if ( (c == ' ' || c == 'n' || c ) = 't')

现在,正如我们所知,逻辑 OR 运算 [ int 1 或 int 0] 的结果不是可修改的 LVAUE,您将看到错误。

仅供参考,从标准C99第6.5.14章第3段,

如果 || 运算符的任一操作数比较不等于 0,则其应生成 1;否则,它将生成 0。结果的类型为 int。

因此,1 = 't'0 = 't'是错误的原因。

没有人解释你得到这个错误的原因。

专注于表达的这一部分 - c == ' ' || c == 'n' || c .假设它的计算结果为某个值,例如1(只是一个随机示例)。那么你不能像这样't' 1 = 't' 1存储。

这将计算为一个表达式,该表达式是一个右值,您无法在其中存储't'

但是,这是完全合法的,即使您的代码可能无法按预期工作:

if (c = 't' || c == ' ' || c == 'n')
  note^

相关内容

最新更新