-1

1) 私は C の未定義の動作について何度も読みました。それは、C がその定義で述べていないいくつかの動作であるため、各コンパイラには実装がありますが、C 標準に違反していません。例は次のとおりx= ++y*4 + ++y*3です。

しかし、ここで誰かが私に異なる結果をもたらす2つのコンパイラを与えることができますか? 私はそれをテストすることに興味があります。(私のマシンにはmingwしかありません)

2) そして、C は操作の順序について述べていません+ - * /。例: 1*2 + 3 + 4*5. * /が最初に計算されますが、他はわかりません。

したがって、以下の例によると:

int a, b, c; 
// assign value for a,b,c
float result = a*b/c; // wrong
float result = (float)a*b/c; // seem true

しかし、b/cそれでも最初に計算できるので、答えは間違っています。したがって、真の型キャストは次のようになります。

float result = a*b/(float)c

しかし、ほとんどの場合、C に関するすべての本、C をコーディングするすべての人は、常に : を使用します(float)a*b/c。それは常に真実ですか、それとも私たちがよく考えるように「通常のコンパイラ」が左から右に解決すると信じているのでしょうか?

この点について、わかりやすく教えてください。

ありがとう :)

4

2 に答える 2

1

1)未定義の動作と未指定の動作を混同している場合、それらは同じではありません。あなたが与えるこの醜い表現は、未定義の動作をします。未定義の動作の結果だとあなたが考えるのは、単なる不特定の動作です。つまり、コンパイラーがさまざまな可能性の 1 つを選択したということです。

未定義の動作はさらに悪化する可能性があります。動作が定義されていない場合、コンパイラは通常、好みに合わせて何でも選択し、昼食を食べ、銀行口座を空にし、コンピューターをクラッシュさせることができます。残念ながら、これらのケースでは予期しない悪いことをコンパイラが行う状況があります。したがって、そもそも UB を誘発しないでください。

于 2012-07-09T20:02:45.963 に答える
0

未定義の動作のコードから異なる結果を取得するために、2つのコンパイラは必要ありません。多くの場合(ほとんどではないにしても)、最適化設定を変更したり、周囲のコードを変更したりすると、1つのコンパイラで異なる結果が得られます。

于 2012-07-09T20:20:36.917 に答える