3

次のコードは正しいですか?私の理解では、正しく機能しないはずですが、Dev-C ++コンパイラでは機能します。誰かが詳細に説明してもらえますか?

#include<limits.h>

int main()
{
long int num_case=LONG_MAX;

scanf("%d",&num_case);

printf("%ld",num_case);
return 0;
}

ありがとう

4

3 に答える 3

5

標準Cライブラリが実行しないように指示するほとんどのことと同様に、未定義の動作を呼び出します。未定義とは、特定の条件下では機能する可能性があるが、予期しないときにクラッシュする可能性があることを意味します。

この場合、long intintは実際には同じ数値表現(4バイト、2の補数)であるため、機能します。別のプラットフォーム(たとえば、x86-64 Linux)では、そうではない可能性があり、おそらく何らかの問題が発生します。特に、8バイトの上位バイトlong intは初期化されないままになります。

編集:「しかし、それはクラッシュするだろう」と尋ねることは間違った方法を考えています。言語標準によれば、初期化されていないバイトを型の変数に読み込むだけでlong int、Cプログラムがクラッシュする可能性があります。プログラムが不適切に指定されていることを理解するために、そうするプラットフォームの例を見つける必要はありません。そこが肝心だ。Cはすぐにルールブックを投げるのではなく、移植して最初の仮定を破るまで待機します。

于 2012-04-26T06:16:04.013 に答える
1

RageDが言うように、実際にはscanf()呼び出しで%ldを使用する必要があります。それが機能する理由は、システム上(または私にはそう見える)でintありlong int、同じサイズ(おそらく4)であるため、scanf()上書きしてはならないメモリを上書きしないためです。

于 2012-04-26T06:17:03.493 に答える
0

通常、32ビットシステムではlong intは32ビット(intと同じ)であり、64ビットシステムではlong intは64ビット(long long intと同じ)です。コードを移植可能にする場合は、「%ld」を指定してscanfを使用します。

于 2012-04-26T06:19:54.343 に答える