次のコードは正しいですか?私の理解では、正しく機能しないはずですが、Dev-C ++コンパイラでは機能します。誰かが詳細に説明してもらえますか?
#include<limits.h>
int main()
{
long int num_case=LONG_MAX;
scanf("%d",&num_case);
printf("%ld",num_case);
return 0;
}
ありがとう
次のコードは正しいですか?私の理解では、正しく機能しないはずですが、Dev-C ++コンパイラでは機能します。誰かが詳細に説明してもらえますか?
#include<limits.h>
int main()
{
long int num_case=LONG_MAX;
scanf("%d",&num_case);
printf("%ld",num_case);
return 0;
}
ありがとう
標準Cライブラリが実行しないように指示するほとんどのことと同様に、未定義の動作を呼び出します。未定義とは、特定の条件下では機能する可能性があるが、予期しないときにクラッシュする可能性があることを意味します。
この場合、long int
とint
は実際には同じ数値表現(4バイト、2の補数)であるため、機能します。別のプラットフォーム(たとえば、x86-64 Linux)では、そうではない可能性があり、おそらく何らかの問題が発生します。特に、8バイトの上位バイトlong int
は初期化されないままになります。
編集:「しかし、それはクラッシュするだろう」と尋ねることは間違った方法を考えています。言語標準によれば、初期化されていないバイトを型の変数に読み込むだけでlong int
、Cプログラムがクラッシュする可能性があります。プログラムが不適切に指定されていることを理解するために、そうするプラットフォームの例を見つける必要はありません。そこが肝心だ。Cはすぐにルールブックを投げるのではなく、移植して最初の仮定を破るまで待機します。
RageDが言うように、実際にはscanf()
呼び出しで%ldを使用する必要があります。それが機能する理由は、システム上(または私にはそう見える)でint
ありlong int
、同じサイズ(おそらく4)であるため、scanf()
上書きしてはならないメモリを上書きしないためです。
通常、32ビットシステムではlong intは32ビット(intと同じ)であり、64ビットシステムではlong intは64ビット(long long intと同じ)です。コードを移植可能にする場合は、「%ld」を指定してscanfを使用します。