我碰到這行代碼用C來了:Ç - 多分配到同一個變量在一行
#define RUNDE(n) (K ^= Q[n], y = K, K = F(K)^xR, xR = y)
它是有效的分配的東西到K多次?我認爲在一個聲明中多次更改一個變量是無效的。
我碰到這行代碼用C來了:Ç - 多分配到同一個變量在一行
#define RUNDE(n) (K ^= Q[n], y = K, K = F(K)^xR, xR = y)
它是有效的分配的東西到K多次?我認爲在一個聲明中多次更改一個變量是無效的。
將某些東西分配給K多次是否有效?
這是完全有效的C宏。這裏使用逗號運算符,
。
使用,
運算符,您可以多次爲變量賦值。
例如K = 20, K = 30;
這將分配30
到K
,覆蓋以前的值20
。
我認爲這是無效的在一個語句來改變一個變量超過一次。
是,如果我們試圖修改變量不止一次在相同的C語句,但這裏先,
是sequence point它會導致不確定的行爲。
因此,我們保證僅在第一次分配(K = 20
)的所有副作用發生時纔會修改K
秒(K = 30
)。
當逗號運算符在其第二個運算元之前評估它時,這是明確定義的。
但是,恕我直言,這個代碼是可怕的,你不應該寫它。功能存在做這樣的事情;使用預處理器就是濫用。當然,你需要將一些參數傳遞給內聯函數,但這比依靠周圍範圍的名稱更可取。
不用多說,它是允許的,但也提供了一個合適的選擇。 +1 – erip
在C++中,這將被視爲討厭;在C中它是允許的,因爲依賴預處理器是更加必要的。
但是在任何一種情況下,您的表情都是完美定義的。逗號運算符(從左向右計算)作爲排序的表達式分隔符。
這個宏的優雅之處在於它的值是xR = y
的值,它是y
的最終值。
但是,這個宏的不雅之處,例如使用不作爲參數傳遞的變量名,可能會超過任何好處。我的傾向是要把它裝進去。
它是一個有效的逗號運算符,按順序執行所有語句,返回最後一條語句的值。
即宏是分配的序列,使用最後分配(y
或xR
)作爲返回值
C或C++。選一個。 – NathanOliver
您可能想了解[序列點與未定義的行爲](http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points) –
逗號運算符是一個序列點,但的確如此無論如何,你的鏈接值得一讀。 – Bathsheba