2015-01-31 109 views
-2

我正在使用Visual Studio 2013來嘗試和學習C語言。C - 找不到這個錯誤:「C2106:'=':左操作數必須是l值」

我使用的是著名K&R book後字面上複製和從書到Visual Studio 2013粘貼下面這段代碼,我得到了錯誤:

1錯誤C2106:「=」:左操作數必須是左值
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 %d\n", nl, nw, nc); 
} 

似乎錯誤來源於聲明:

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

但我真的無法弄清楚什麼是錯,沒有提到代碼是從書中直接的事實。

任何幫助將不勝感激!

謝謝!

+2

也許你的剪貼板被打破 – 2015-01-31 21:13:58

+0

:3。我想我需要休息一下。 – xashcorex 2015-01-31 21:18:35

回答

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

我建議你休息一下。即使不知道該任務會嘗試寫入||的結果,因爲它的優先級較低,但差異在尖叫。

+0

Godamnit我一直在閱讀最後一小時的代碼:/!我現在感到很傻。還是要謝謝你的幫助 ! – xashcorex 2015-01-31 21:12:23

+1

@xashcorex不要忘記接受我們的答案,如果問題解決了:) – Quentin 2015-01-31 21:19:37

+1

我會,4分鐘以上:) – xashcorex 2015-01-31 21:21:18

3

更改c = '\t'c == '\t'if的條件。否則,條件表達式將被解析爲

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

((c == ' ' || c == '\n') || c)是右值(布爾值;一個常數),它是不可分配(它像1 = 2)。

+1

啊,尤達的條件;) – Quentin 2015-01-31 21:14:14

+2

@ouah;是它的醜陋,但有時作爲救世主工作。順便說一句,刪除了:) – haccks 2015-01-31 21:17:07

3

您需要更改現有

c = '\t' 

c == '\t' 

否則,由於較高的precedence||=,你的代碼會像

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

現在,正如我們所知,邏輯OR操作的結果[int 1或int 0]不是可修改的lvaue,你會看到錯誤。

僅作參考,從章6.5.14條第3款,C99標準,

的||如果其任一操作數比較不等於0,則運算符應產生1;否則,它將產生0.結果的類型爲int。

因此,或0 = '\t'是錯誤的原因。

1

沒有人解釋你爲什麼得到這個錯誤。

專注於這部分表達 - c == ' ' || c == '\n' || c。假設它被評估爲某個值1(只是一個隨機的例子)。那麼您不能在1這樣的中存儲'\t'

這將評估爲一個表達式,它是一個rvalue,您不能在其中存儲'\t'

然而,這是完全合法的,即使如你預期你的代碼可能無法正常工作:

if (c = '\t' || c == ' ' || c == '\n') 
    note^ 
+1

我做到了,我簡單地承認。 – Quentin 2015-01-31 21:18:29

相關問題