-3

分析する単純でばかげたコード スニペットがあります。本質的には、次のようなことを実行します。

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=ba=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;}
4

1 に答える 1

1
a = b = c;

と同じです

a = (b = c);

これはあなたの2つの例で有効です。

しかし、そのようなキャストはオーバーフローする可能性があり、それは UB になりますよね?

キャストはありませんが、ある型から別の型への暗黙的な変換です。型の値を に変換するときに、値unsigned intがで表現できないint場合、変換の結果は実装定義であるか、実装定義の動作シグナルが発生します。厳密に言えば、これはまだオーバーフローではなく、未定義の動作でもありません。unsigned intint

于 2013-03-22T22:47:26.770 に答える