下面是我寫的一段代碼,旨在將陣列nums中的元素整合成一個整數,在整合程序中檢測是否超過int型別的數值范圍,一旦超過就回傳0
int main(void)
{
int x=0;
int nums[11]={0,3,2,1};
int i=4,j;
int a=nums[0];
for (j = 1; j < i; j++)
{
if (a == 0)
{
//if(x*10<-2147483648 || x*10>2147483647 || x*10+nums[j]<-2147483648 || x*10+nums[j]>2147483647)
if (x * 10 > 2147483647 || x * 10 + nums[j] > 2147483647)
//return 0;
return 0;
}
//else if (nums[0] == 1) //對負數的處理
if (a == 1) //對負數的處理
{
//if(0-(x*10)<-2147483648 || 0-(x*10)>2147483647 || 0-(x*10+nums[j])<-2147483648 || 0-(x*10+nums[j])>2147483647)
if (0 - (x * 10) < -2147483648 || 0 - (x * 10 + nums[j]) < -2147483648)
return 0;
}
//if(a==0)
//{
// if (x * 10 > 2147483647L || x * 10 + nums[j] > 2147483647L)
// return 0;
//}
x = x * 10 + nums[j];
}
printf("%d\n",x);
return 0;
}
一個詭異的問題是,程式會跳過for回圈里的兩條if陳述句,直接執行回圈里的最后一條陳述句。這是怎么回事?
求大神解答
uj5u.com熱心網友回復:
x * 10 > 2147483647 || x * 10 + nums[j] > 2147483647這樣的陳述句永遠為真,因為int 永遠不會大于INT32_MAX ,如果計算結果大于了INT32_MAX,則會回卷。
uj5u.com熱心網友回復:
上邊有誤,應永遠為假uj5u.com熱心網友回復:
a=num[0],也就是0,后邊也沒有修改過a ,所以下邊a==1,本程式不會執行。uj5u.com熱心網友回復:
這有啥詭異的,就好象你取得了自己所在位置的地球經緯度,然后寫了個if
說如果在東經180度的東邊,或者在西經180度的西邊,或者北緯90度北邊,或者南緯90度南邊,那就輸出個出錯資訊。
這不就是廢話么?自然的就廢掉了。
道理一樣一樣的。
uj5u.com熱心網友回復:
計算機的數學不是人類數學,它只是一個粗糙的近似。這就是現行的計算機體系結構不能誕生真正的人工智能的哲學層面的理由。
uj5u.com熱心網友回復:
輸入的時候,如果超出int的范圍,會回卷。你可以用long long型別,如果沒超出范圍,再轉為intuj5u.com熱心網友回復:
或者以字串的形式判斷uj5u.com熱心網友回復:
我好奇的是,連a是否等于0都沒有判斷
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/264282.html
標籤:C語言
上一篇:c++
下一篇:c++程式
