[英]short and int in c
short int a,b,c;
scanf("%d%d",&a,&b);
c = a + b;
printf("%d %d %d",a,b,c);
輸入: 5 8
輸出: 0 8 8
為什么值a
0? 任何人都能解釋一下嗎?
平台--- GCC ubuntu 10.04
具有"%d"
格式的scanf
需要int*
參數。 你給它一個short int*
參數,因此你的程序的行為是未定義的。
如果你真的想知道為什么你得到你得到的結果,我可以推測,但更正你的代碼更容易:
scanf("%hd%hd", &a, &b);
您可以繼續對printf
使用"%d"
,因為short int
參數被提升為int
。 您可以在printf
使用"%hd"
,但這不是必需的。 (對於int*
沒有類似的short int*
參數的提升。)
你可以放心地在這里停止閱讀。
以下是關於您的錯誤代碼中可能發生的事情的一些猜測。 這不是解決方案; 解決方案是糾正您的代碼,使其完成您希望它執行的操作。 但是,如果錯誤的代碼行為不當,可能會有所幫助。
假設short
是16位, int
是32位,這是典型的。 格式字符串中的第一個"%d"
告訴scanf
讀取一個值(您給它5
)並將其存儲到第二個參數&a
指向的32位int中。 由於a
只有16個buts,它會將一半的32位值存儲在a
,另一半存儲在一些相鄰的內存塊中。 第二個"%d"
與&b
做同樣的事情; 它存儲的32位表示的一半8
中b
,而另一半在別處。
根據您的輸出,似乎第二個"%d"
導致scanf
將值8
的低16位存儲在b
,而高階16位(值為0)存儲在a
,覆蓋存儲的值由第一個"%d"
。 請注意,第一個"%d"
中的高16位可能存儲在其他位置,可能會破壞其他一些變量,或者可能寫入一些未使用的內存。
所以結果是,你已經存儲在第0 a
和8 b
,這說明你得到的輸出。
所有這些都是非常具有推測性的,許多其他結果都是可能的。 這種分析僅用於跟蹤錯誤代碼的行為,目的是糾正它。 編寫故意利用這種東西的代碼是一個非常糟糕的主意。 該語言完全沒有說明像這樣的錯誤代碼會做什么; 它的行為可能在不同的系統上有很大的不同,有不同的編譯器設置,甚至取決於月亮的相位。
在VC ++ 6.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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.