2012-07-25 23 views
0
void InsertA(SET *A,int elem) 
{ 
    if(isMember(*A,elem) == false) 
    { 
    *A = *A || 1<<elem;; /*it says its in this row*/ 
    } 
} 

/*錯誤:函數插入要求的Lvalue 對這個傢伙有什麼想法?小白這裏需要L值嗎? C編程位模式

*/

+1

檢查運算符優先級(換句話說 - 括號是你的朋友)。還要確保錯誤確實存在於你指定的行中(我剛剛編譯了你的代碼 - 一旦我刪除'isMember'並用'int'代替'SET',MSVC++ 2010就可以正常工作) – YePhIcK 2012-07-25 10:53:32

+3

什麼是SET? ? ? – wildplasser 2012-07-25 11:02:28

回答

2

在此聲明:

*A = *A || 1<<elem;; /*it says its in this row*/ 

我們這些運營商*,=,||,<<

現在看優先級表在

Precedence Operator operation     associativity 
       -------- ---------     ---------------- 
3     *  Indirection (dereference)  R to L 
7     <<  Bitwise left shift    L to R 
14     ||  Logical OR      L to R 
16     =  Direct assignment    R to L 

所以讓我們看看會發生什麼:

1)間接將首先執行。他們有兩個。他們將右至左聯繫起來。這意味着正確的一個將首先執行。理解這裏有兩個解引用運算符是很重要的,在遇到運算符=時稍後會有所不同。

2)左移一位將在1上執行。 3)邏輯或將與*A一起執行並且按位移的結果。它可以評估零或非零。 4)該零/非零值將被分配給*A。這裏*A可以在運算符=的上下文中被視爲左值。如果你留下這個考慮,它會導致含糊不清。因爲我們經常會將*A這樣的解引用操作看作rvaluevalue來使用。實際上它是一個有效的lvalue,它將被隱式轉換爲rvalue(這是當存儲在由A指向的地址處的value被返回時)。否則*A只是一個內存容器,它是開放的值。

所以,事情是你的表達是不確定的,沒有任何意義,你爲什麼要把邏輯的值放入*A。如果使用二進制or而不是邏輯,它將更有意義。

讓我們做到這一點:

我們已經在我們的優先級表中的新條目時,將進行逐位或在第3步會發生

Precedence OP OPeration  Associativity 
12   | Bitwise OR   L to R 

唯一的變化。

允許有一個例子

可以說elem = 3. A被指向* A的將被執行的陣列{1,2,3,3,4}

1)」。它只會計算處理器的loadstore指令所需的「偏移量」。

2)我們將得到一個恆定的位模式:1 << 3 = 1000 3)現在|我們需要rvalues作爲兩個操作數。所以現在將執行load指令來獲取存儲在存儲器中的值。說它的2。因此,我們將得到0010 | 1000 = 1010 4)存儲指令將執行把這個位模式到內存中,因此該陣列會像{1,A,3,3,4}

說明太多冗長:我認爲這可以幫助,如果未來用戶誰將會嘗試找出如何通過語言規則解析複雜的表達。

+0

謝謝你的回答,並且對於最近的回覆感到抱歉,我總是忘記檢查一下stackoverflow,再次感謝你 – psyko666 2013-01-06 10:53:35

0

正如評論指出,代碼應該編譯。 但它看起來像你想在int設置一點,所以我懷疑,你真的想要|而不是||。 所以,你應該做的

*A |= 1<<elem; 
+0

感謝回覆隊友真的很感激它,即時調試,我只需要一些想法不真正的答案,再次感謝:) – psyko666 2012-07-25 11:11:42

+0

我求求不同。代碼不應該編譯。 1)SET未定義2)isMember()未定義3)false未定義。是的:OP可能需要'| ='。 – wildplasser 2012-07-25 11:15:09

+0

uhm它只是整個程序的一個片段1,2,3已經定義:) – psyko666 2012-07-25 11:22:29

0

||是一種邏輯運算,而不是按位運算。您是否嘗試將其更改爲|?

每當你做A =你有可能創建一個臨時的A,與* A相同。小心使用=運算符並查找如何禁用複製構造函數。

您可以使用| =運算符。 A | =(1 < <不管)

編輯:確保你沒有用C++編譯器在C++模式下編譯你的C代碼。 GCC有一個C開關,它取決於你的構建環境。

+0

它是C,而不是C++,所以不用擔心拷貝構造函數。 – 2012-07-25 11:17:35

+0

@DanielFischer的確如此,但它可以用C++編譯器編譯。人們經常編寫C語言並使用C++進行編譯。一個結構可能會有一個自動生成的拷貝構造函數。 – 2012-07-25 11:18:46

+0

同樣,使用C++編譯器編譯C會導致大量潛在的問題。 – 2012-07-25 11:20:01