2016-10-24 3 views
0

"="記号の右側に数学演算を使用してグローバル変数を初期化するとき、コンパイラは何をしますか?グローバル変数の初期化における数学演算、マシンは何をしますか?

例:

int global1=75; 
int global2=32+84; 
int global3=(global1+global2); 

int main(){ 
return global3; 
} 

プログラムは、私にはわからないものを191 =(75+(32 + 84))

を返すべき結果は、コンパイル時または実行時に算出したかどうかであります

+3

これは[有効ではありません](https://ideone.com/NB6oJ0)です。 –

+0

申し訳ありません。タグが修正されました。ありがとう! –

答えて

2

32+84は、コンパイラが任意の変数の値を知ることなく値を計算することができる算術式の基本的なCおよびC++標準の用語である「定数式」です。定数式は、あなたの

int global2=32+84; 

技術的にはどちらもCも、標準C++のように、グローバル変数を初期化するために使用される場合はさらに必要とコンパイル時に評価されるように、しかし、あなたは、ハード押されたことと思いますそのようにしなかったコンパイラを見つけることができます。 (コンパイラが実際にコンパイル時に定数式を評価しなければならない他のコンテキストもあるので、それを行うコードを持たなければならないので、常にそうするかもしれません)。

global1+global2は "定数表現 "と呼ばれる。 Cでは、グローバル変数の初期化には使用できません。コンパイル時にエラーが発生します。 C++では、許可されており、コンパイル時または実行時に追加が行われるかどうかは不明です。唯一の保証は、mainが実行を開始するまでにglobal3が正しい値を持つことです。特に、ではなく、がグローバルオブジェクトのコンストラクタから観察された場合に正しい値を持つ可能性があります。

C++で(

を(経験的に、G ++ 6 ++ 3.9を打ち鳴らすことは、両方の可能性が実際に発生したことを確認するコンパイル時間でそれを行うのに対し、実行時にglobal3の値を計算する)が、ないglobal1global2両方がconst宣言されていた場合はC、global1+global2は定数式と考えられる。)

+0

この回答は良いです:) – nephi12

0

もしC++を意味している場合、私はそれを実行するために実際のコードを必要とするglobal3は、実行時に計算されると信じています。これは動的初期化と呼ばれ、cはisをサポートしませんが、私はC++と信じています。 cとC++の両方は、実際の値がディスクに格納されているので、global1と2の静的初期化を可能にします。誰かがあなたに砂糖と塩が必要だと言うレシピを与え、それを混ぜてから小麦粉を加えたら、レシピを使うのを待って砂糖と塩を入れて保管しますか?いいえ、あなたは「ランタイム」でミキシングを行います。しかし、砂糖と塩を用意して準備していますが、混ぜ合わせてはいけません。砂糖と塩はglobal1と2であり、混合物はglobal3である。

関連する問題