我有一個簡單而愚蠢的代碼片段來分析。 它在本質上進行類似:鏈接分配和隱式轉換的優先級
a = b = c;
但類型是非常棘手的。
在一個地方,我有:
int a,c;
unsigned int b;
在其他地方,我有:
int a;
unsigned int b,c;
如果編譯器解釋A = B,然後我轉換一個unsigned int到int
OK,在2補碼上,無論如何,這種轉換是無效的
但是這樣的轉換可能會溢出,這將是UB,是不是?
而在這種情況下,編譯器有一個許可證來推測我不依賴UB,因此最終可以認爲a> = 0,並且不再進行進一步的測試if(a<0) blah...
它是對的嗎?
在這種情況下,兩段代碼都會導致相同的行爲。
如果編譯器解釋a = c
,我認爲這是做什麼,如果我上面的UB分析是正確的,那麼這兩段代碼可能會給出不同的結果。
因此,如何在這些表達解釋a=b
或a=c
,或者換言之在這種情況下,可以這樣的(a<0)
分支被消除,只有一個,兩個或無?
最後一點,我的確切情況是內聯函數的返回值,但我認爲它不會超出上述結論,對吧?
static inline int a1(unsigned int *b,unsigned int c) {return *b=c;}
static inline int a2(unsigned int *b,int c) {return *b=c;}
1.代碼中沒有強制轉換。 2.你發佈的函數除了拋出語法錯誤之外別無其他。 – 2013-03-22 22:47:16
@ H2CO3哎呀,謝謝,我的錯誤 – 2013-03-22 22:51:14