分析する単純でばかげたコード スニペットがあります。本質的には、次のようなことを実行します。
a = b = c;
しかし、タイプは非常にトリッキーです。
私が持っている1つの場所で:
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 分析が正しい場合、2 つのコードは異なる結果をもたらす可能性があります。
では、これらの式はどのように解釈される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;}