我先假設是C了,既然題主從彙編角度去考慮了。
然後,第一句話是,別從彙編角度考慮!
不然換編譯器,換平臺,換體系結構,分分鐘死給你看。
你既然在寫C,就要從C的角度去思考。C和彙編不是一對一的關係。何況不同體系結構的彙編都不同。
唯一正確的做法是去看spec。
if (x>y)就是判斷x>y的,這麼用顯然沒問題。
if (x-y>0)呢?你就要去看x-y的spec。
如果x和y是unsigned的話,這個的效果永遠是有定義的,但是可能溢位,負的會溢位成正的……結果 if (x-y>0) 的實際效果等同於 if (x!=y)。
如果x和y是signed的話,這個的效果在溢位的時候是沒定義的。那麼if (x-y>0)僅僅在x-y結果不溢位的時候和if (x>y)相等。
至於x86彙編的flags,不需要去考慮。如果你沒有用到未定義行為,你可以相信編譯器會幫你正確地使用flags;如果你用到了未定義行為,編譯器突然從電腦裡跳出來把你打一頓也是有可能的……所以去思考x86彙編的flags不會給你任何好處。
這就是@ivony說的要面向應然程式設計。不要去依賴spec裡沒有保證的事情,哪怕你自己實際測試過了,看了編譯器生成的彙編,也不要做。
最後反對 @姬宇航 的回答,很多語言這裡兩句話的效果都不一樣。“不管溢位不溢位,在任何語言的實現中,這兩個要是結果不一樣,這門語言也就輪不到用來面試別人”這句話是not even wrong。
我先假設是C了,既然題主從彙編角度去考慮了。
然後,第一句話是,別從彙編角度考慮!
不然換編譯器,換平臺,換體系結構,分分鐘死給你看。
你既然在寫C,就要從C的角度去思考。C和彙編不是一對一的關係。何況不同體系結構的彙編都不同。
唯一正確的做法是去看spec。
if (x>y)就是判斷x>y的,這麼用顯然沒問題。
if (x-y>0)呢?你就要去看x-y的spec。
如果x和y是unsigned的話,這個的效果永遠是有定義的,但是可能溢位,負的會溢位成正的……結果 if (x-y>0) 的實際效果等同於 if (x!=y)。
如果x和y是signed的話,這個的效果在溢位的時候是沒定義的。那麼if (x-y>0)僅僅在x-y結果不溢位的時候和if (x>y)相等。
至於x86彙編的flags,不需要去考慮。如果你沒有用到未定義行為,你可以相信編譯器會幫你正確地使用flags;如果你用到了未定義行為,編譯器突然從電腦裡跳出來把你打一頓也是有可能的……所以去思考x86彙編的flags不會給你任何好處。
這就是@ivony說的要面向應然程式設計。不要去依賴spec裡沒有保證的事情,哪怕你自己實際測試過了,看了編譯器生成的彙編,也不要做。
最後反對 @姬宇航 的回答,很多語言這裡兩句話的效果都不一樣。“不管溢位不溢位,在任何語言的實現中,這兩個要是結果不一樣,這門語言也就輪不到用來面試別人”這句話是not even wrong。