C語言初學習——易錯點合集(持續更新中)

lanying24發表於2024-03-14

跳脫字元
例題一

int main()
{
    char s[] = "012xy\08s34f4w2";
    int i, n = 0;
    for (i = 0; s[i] != 0; i++)
    {
        if (s[i] >= '0' && s[i] <= '9')
        {
            n++;
        }
    }
    printf("n=%d\n", n);
}

輸出:
——
n=3
——

例題二

int main()
{
    char s[] = "\01234";
    for (int i = 0; s[i]; i++)
    {
        printf("1");
        printf("%c\n", s[i]);
    }
}

輸出:
——
1

13
14

——

總結:
八進位制值的判斷取決於後續是否為合法的八進位制。
以\開始,最少1位,最多3位,且必須是合法的8進位制數字,即0~7,如"\012"。
例:在"\08"中,’\0’為結束符。

自增與自減
例題一

int main()
{
    int k = 5, n = 4;
    while (k--)
    {
        printf("%d\n", k -= 1);
    }
    printf("---------\n");
    while (--n)
    {
        printf("%d\n", --n);
    }
}

輸出:
——
死迴圈
——

總結:
自增與自減也同樣應用在迴圈體判斷裡,後置--時先根據當前值進行判斷,是否進入迴圈體,再改變自身的值,最後執行迴圈體語句。

例題二

int main()
{
    int a = 0;
    printf("%d %d %d %d", ++a, a, a++, ++a, a);
}

輸出:
——
3 3 1 3
——
總結:
在C語言中有個很常用的函式printf,使用時從右向左壓棧,依次從右向左開始計算,計算完後才會往%d中輸出,因為有多條賦值語句,所以它是個累加過程,直到壓棧結束後輸出最終得累加值,而遇到a++這種先使用再變化的量則優先輸出。
參考:
https://blog.csdn.net/weixin_43919932/article/details/88544728

指標
例題一

main()
{
    int m = 0;
    int *n = &m;
    printf("value:%d\taddress:%d\n", m, &m);
    *n += 1;
    printf("value:%d\taddress:%d\n", *n, n);
    *n++;
    printf("value:%d\taddress:%d\n", *n, n);
}

輸出:
——
value:0 address:6422036
value:1 address:6422036
value:6422040 address:6422040
——
總結:
因為後置 ++ 運算子的優先順序高於 * ,所以在編譯器的語句實際上是:*(n++);

問:浮點數
例題一

float fun(float h)
{
    return (int)(h * 100) / 100.0;
}
main()
{

    printf("%f\n", fun(22.223000));
    printf("%f", (int)(22.223000 * 100) / 100.0);
}

輸出:
——
22.219999
22.220000
——
疑問:
為什麼相同的操作,使用函式進行封裝後導致了精度缺失

相關文章