2011-12-23 10 views
3
short int a,b,c; 
scanf("%d%d",&a,&b); 
c = a + b; 
printf("%d %d %d",a,b,c); 

入力:5 8短いとint型Cで

出力:0 8 8

なぜa 0の値がありますか?誰かがこれを説明できますか?これによると

プラットフォーム--- GCCのUbuntu 10.04

答えて

11

scanf,"%d"フォーマットの場合は、int*引数が必要です。あなたはそれにshort int*引数を与えているので、あなたのプログラムの動作は未定義です。

あなたが実際にあなたが取得している結果を得ている理由は、私はそれを推測することができます知ってほしい、それだけであなたのコードを修正するためにはるかに簡単だ場合:

scanf("%hd%hd", &a, &b); 

あなたが続けることができますshort int引数がintに昇格されるため、printf"%d"を使用するようにしてください。あなたはprintf"%hd"を使うことができますが、それは必要ではありません。 (int*short int*引数のない同様のプロモーションはありません。)


あなたは無事にここで読んで停止することができます。


以下は、間違ったコードで起こっている可能性があることに関するいくつかの推測です。これは解決策ではありません。解決策はコードを修正して、それがあなたがしたいことをすることです。しかし、間違ったコードがどうやって不正行為を起こすかを知ることは有益なことかもしれません。

shortが16ビットであり、intが32ビットであると仮定します(これは標準的です)。書式文字列の最初の"%d"は、に値(それに5としたもの)を読み込み、第2引数である&aが指す32ビットintに格納するように指示します。 aは16だけであるため、aに32ビット値の半分を格納し、残りの半分はメモリの隣接するチャンクに格納します。 2番目の"%d"&bで同じことを行います。 8の32ビット表現の半分をbに格納し、残りの半分を別の場所に格納します。

あなたの出力に基づいて、第二"%d"値を上書きし、abの値8の下位16ビット、および(値0の)上位16ビットを格納するscanfを引き起こしたと思われます最初の"%d"によって格納されます。最初の"%d"からの上位16ビットはおそらく他の場所に格納されていた可能性があります。おそらく他の変数を壊していたり​​、そうでなければ未使用のメモリに書き込んだりしています。

その結果、aには0が、bには8が格納されているため、出力が表示されます。

これはすべて非常に推測的であり、他の多くの結果が可能です。この種の解析は、間違ったコードの動作を追跡し、修正することを目的として、のみ有効です。意図的にこの種のものを利用するコードを書くことは、非常に悪い考えです。言語は、このような不正なコードが何をするかについて全く何も言わない。その動作は、さまざまなコンパイラ設定や、月のフェーズに応じて、システムによって大きく異なる場合があります。 VC++ 6.0で

+0

@Aryaキースの憶測が非常にありますおそらく正しい。 'a、b、c'のアドレスを表示すると、'&a = 0x7fffee2bee8e、&b = 0x7fffee2bee8c、&c = 0x7fffee2bee8a'(gcc-4.5.1、x86_64)を得ました。これらのアドレスにある変数をリトルエンディアンシステムで使用すると、推測ではコンパイラが許可されただけで偽のコードを生成してしまうことがなくなった場合に起こることを正確に説明します。 –

0

cの値が13

#include <stdio.h> 

int main() 
{ 

short int a,b,c; 
scanf("%d%d",&a,&b); 
c = a + b; 
printf("%d + %d = %d\n",a,b,c); 


return 0; 
} 
+0

動作は未定義です。 a、b、cの値は全く文字通り何でもかまいません。 –

関連する問題