2016-01-14 18 views
3

我碰到這行代碼用C來了:Ç - 多分配到同一個變量在一行

#define RUNDE(n) (K ^= Q[n], y = K, K = F(K)^xR, xR = y) 

它是有效的分配的東西到K多次?我認爲在一個聲明中多次更改一個變量是無效的。

+6

C或C++。選一個。 – NathanOliver

+1

您可能想了解[序列點與未定義的行爲](http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points) –

+0

逗號運算符是一個序列點,但的確如此無論如何,你的鏈接值得一讀。 – Bathsheba

回答

4

將某些東西分配給K多次是否有效?

這是完全有效的C宏。這裏使用逗號運算符,

使用,運算符,您可以多次爲變量賦值。

例如K = 20, K = 30;這將分配30K,覆蓋以前的值20


我認爲這是無效的在一個語句來改變一個變量超過一次。

是,如果我們試圖修改變量不止一次在相同的C語句,但這裏先,sequence point它會導致不確定的行爲。

因此,我們保證僅在第一次分配(K = 20)的所有副作用發生時纔會修改K秒(K = 30)。

2

當逗號運算符在其第二個運算元之前評估它時,這是明確定義的。

但是,恕我直言,這個代碼是可怕的,你不應該寫它。功能存在做這樣的事情;使用預處理器就是濫用。當然,你需要將一些參數傳遞給內聯函數,但這比依靠周圍範圍的名稱更可取。

+0

不用多說,它是允許的,但也提供了一個合適的選擇。 +1 – erip

1

在C++中,這將被視爲討厭;在C中它是允許的,因爲依賴預處理器是更加必要的。

但是在任何一種情況下,您的表情都是完美定義的。逗號運算符(從左向右計算)作爲排序的表達式分隔符。

這個宏的優雅之處在於它的值是xR = y的值,它是y的最終值。

但是,這個宏的不雅之處,例如使用不作爲參數傳遞的變量名,可能會超過任何好處。我的傾向是要把它裝進去。

1

它是一個有效的逗號運算符,按順序執行所有語句,返回最後一條語句的值。

即宏是分配的序列,使用最後分配(yxR)作爲返回值