我正在使用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^