冷蔵庫パンダ@cnblogs 2019年8月3日を作ります
1、問題
ある日、私は、次のコードを記述します。
符号なしチャー ReadByteFromFile(ファイル*のFP) { 符号なしチャーCH。 ... のfread(&CH、1、1 、FP); ... リターンCH; } ボイドメイン() { ... のprintf(" 最初のバイトは= 0X%02X、第二のバイト= 0X%02X \ n " 、ReadByteFromFile(FP)、ReadByteFromFile(FP))。 ... }
コードが連続してファイルから2つのバイトを読み込み、それをプリントアウトすることを目的とprintfのライン。仮説は、「0x01の02 03 04 ... ...」のためにファイルの内容を読んでいるし、期待される業績は次のとおりです。
最初のバイト = 0x01で、第二のバイト = 0x02の
しかし、実際の業績(Ubuntuの、GCCコンパイラ)が逆転しました:
最初のバイト = 0x02の、第二のバイト = 0x01の
2、答え
面白い、えーえー。(いくつかのクラスのコンテンツとインターネット検索長い時間前にことを思い出してくださいと何の所定の標準のCコンパイラは、関数のパラメータを計算するために存在しないことがわかった引数渡しとして知られているこの形式の値によってコールされています。標準のATで任意のための順序を指定していない
評価引数の。)。2つのバイトでも、ここで文書を読むためには、実行時に、左から右への順序に従って計算言い換えれば、オリジナルの思考のprintf()のパラメータ値。しかし、実際には、コンパイラの出力結果は、printfの()関数はprintf関数につながった右から左へ順にパラメータを算出する(左から右へ最初ReadByteFromFile()関数()の後に)読んで第一、第二ReadByteFromFile(一方ファイル)が、ファイル、及び逆の順序で予想される最終的な出力を読み取ります。
次のコードは、結果が「45545.」で出力理由:またはStackOverflowの上の疑問を持つユーザーは、より良い問題を説明するために提示しました
メイン()
{ I = int型5 。 printf(" %D%D%D%D%D%D "、私は、++、i-- ++ - 私は、i)は、}
このように、使用中の機能それは同じ変数/オブジェクトに対していくつかの操作を伴う場合、コンパイラは、アカウントに秩序パラメータ算出処理機能の不確実性を取る必要があります。)(これが起こることをお勧めします、または今すぐ関数の外部の計算を完了し、その後、結果はprintf関数に渡されます。もちろん、コンパイラはパラメータを計算するために、合意できる場合(最高の毎日の習慣に沿って、左から右へ)、私は、コードの外観は/簡単なのいくつかを記述しますいくつかのものを保存することができました。