20

私は C プログラミング言語の初心者です。最近、関数の学習を始めました。関数はキーワード returnを使用して、呼び出し元関数で値を返すことを学習しました。例えば以下のプログラム。

int getVal(){
 return 1000;
}

int main(){
int x = getVal();
printf("x = %d",x);
return 0;
}

x = 1000を出力します

しかし、(ターボCコンパイラ32ビットの下で)次のプログラムがx = 1000としても出力を生成する理由がわかりません。説明してください。

int get_val(){
 _AX = 1000;
}

int main(){
int x = get_val();
printf("x = %d",x);
return 0;
}
4

4 に答える 4

26

「戻り値」は、ほとんどの x86 システムで EAX (32 ビット) または AX (16 bit) [_AX が実際には内部的に EAX ではないとは言っていない].

このコンパイラは、_AX という名前を付けることで、「レジスタ」を直接使用することを明らかにサポートしています。したがって、[E]AX レジスタに値をロードすることで、基本的にこの値を返します。

インラインアセンブラでも同じことができますが、これは他のコンパイラでは絶対に機能しません。

于 2013-07-18T11:18:19.897 に答える
6

TC コンパイラ (32 ビット) によると、関数の戻り値はアキュムレータ (AC) に格納され、_AX を使用して TC コンパイラでアクセスできるため、次のように記述します。

_AX = 1000;

Accumulator 内に値 1000 を配置していることを意味し、関数の実行が完了して制御が呼び出し元関数に到達すると、Accumulator の値がチェックされます。この場合、この値は x に格納されます。

ここで声明

x = get_val();

単純だろう

x = 1000;

ただし、これはあなたの場合のみであり、(TC 32 ビット Windows コンパイラ) では、他のコンパイラでは機能する場合と機能しない場合があります。

于 2013-07-18T11:39:56.310 に答える
0

getval() では、1000 がアキュムレータに格納され、getval() は関数が値を返す必要があることをコンパイル時に警告し、メインでは x に返された値またはアキュムレータに格納された 1000 の値が割り当てられます。これが理由です。 x=1000 と表示されます。

于 2017-07-10T13:39:39.587 に答える