十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
變量未賦初始值列舉一些C語言編程常見的錯誤,這些錯誤比較隱蔽,比較難發(fā)現(xiàn)。程序可以正常運行,但無法獲得正確的結(jié)果
#includeint calSum(int sum);
int main(void) {int sum,sum0,sum1,sum2; // 第6行
printf("初始值 %d %d %d %d\n", sum, sum0, sum1, sum2);
printf("計算結(jié)果 %d %d %d %d\n", calSum(sum), calSum(sum0), calSum(sum1), calSum(sum2));
return 0;
}
int calSum(int sum) {for (int i = 0; i< 10; i++) {sum = sum + i;
}
return sum;
}
第6行的變量未賦初始值,它的默認(rèn)值是0嗎?
運行結(jié)果如下
初始值 0 4199705 0 8
計算結(jié)果 45 4199750 45 53
不同的編譯器運行結(jié)果可能不同??梢钥闯鲇行┑某跏贾凳?,有些初始值不是0。錯誤在編譯階段發(fā)現(xiàn)不了,運行的時候有時也是正確的,有些情況是錯誤的
數(shù)組越界#include#define SIZE 10
int main(void) {int arr[SIZE] = {1,2,3,4,5,6,7,8,9,10};
for (int i = SIZE; i<= SIZE + 5; i++) {arr[i] = 20;
}
for (int i = 0; i<= SIZE + 5; i++) {printf("arr[%d] is %d\n", i, arr[i]);
}
return 0;
}
上面的代碼編譯、運行都不會報錯。C語言不會檢查數(shù)組越界的問題,超過了索引還是可以設(shè)置值,但是輸出的值卻不正確,結(jié)果如下
arr[0] is 1
arr[1] is 2
arr[2] is 3
arr[3] is 4
arr[4] is 5
arr[5] is 6
arr[6] is 7
arr[7] is 8
arr[8] is 9
arr[9] is 10
arr[10] is 10
arr[11] is 21
arr[12] is 10491360
arr[13] is 0
arr[14] is 4199367
arr[15] is 0
可以看到超過索引之后的賦值,取出來的數(shù)據(jù)都是錯誤的。
case 之后沒有 break;#includeint main(void) {int arr[3] = {1,2,3};
for (int i = 0; i< 3; i++) {printf("arr[%d] = %d\n", i, arr[i]);
switch (arr[i]) {case 1:
printf("match case 1\n");
case 2:
printf("match case 2\n");
case 3:
printf("match case 3\n");
default:
printf("match default\n");
}
}
return 0;
}
代碼片段中沒有 break, 當(dāng)匹配到某個 case 之后,在這個 case之后的輸出都會執(zhí)行,執(zhí)行結(jié)果如下
arr[0] = 1
match case 1
match case 2
match case 3
match default
arr[1] = 2
match case 2
match case 3
match default
arr[2] = 3
match case 3
match default
修改上面的代碼片段,加上 break 之后,看看運行結(jié)果
#includeint main(void) {int arr[3] = {1,2,3};
for (int i = 0; i< 3; i++) {printf("arr[%d] = %d\n", i, arr[i]);
switch (arr[i]) {case 1:
printf("match case 1\n");
break;
case 2:
printf("match case 2\n");
break;
case 3:
printf("match case 3\n");
break;
default:
printf("match default\n");
}
}
return 0;
}
再次運行,結(jié)果如下
arr[0] = 1
match case 1
arr[1] = 2
match case 2
arr[2] = 3
match case 3
if、else 沒有加花括號
if 沒有加花括號#includeint main(void) {for (int i = 0; i< 3; i++) {if (i >= 2)
printf("%d >= 2\n", i);
printf("%d 大于或等于 2\n", i);
}
return 0;
}
上面的代碼片段,期望得到的結(jié)果是
2 >= 2
2 大于或等于 2
實際運行的結(jié)果如下:
0 大于或等于 2
1 大于或等于 2
2 >= 2
2 大于或等于 2
由于 if 沒有加 括號,那么這個if 的作用域到 ; 結(jié)束。
修改程序為如下,就可以得到預(yù)期的結(jié)果
#includeint main(void)
{for (int i = 0; i< 3; i++)
{if (i >= 2)
{printf("%d >= 2\n", i);
printf("%d 大于或等于 2\n", i);
}
}
return 0;
}
兩條輸出語句都在 if 的花括號里面,都屬于這個 if 的作用域
if-else 都沒加花括號#includeint main(void)
{for (int i = 0; i< 3; i++)
{if (i >= 1)
if (i >= 2)
printf("%d >= 2\n", i);
else
printf("%d< 1\n", i);
}
return 0;
}
else 與 那個 if 匹配?
運行結(jié)果如下
1< 1
2 >= 2
從運行結(jié)果看,else 與 if (i >= 2) 匹配了,與最近的 if 匹配了,并不是按照縮進對齊的,if、else 都加上花括號就正確了
#includeint main(void)
{for (int i = 0; i< 3; i++)
{if (i >= 1)
{if (i >= 2)
{printf("%d >= 2\n", i);
}
}
else
{printf("%d< 1\n", i);
}
}
return 0;
}
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧