跳脫字元
例題一
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
——
疑問:
為什麼相同的操作,使用函式進行封裝後導致了精度缺失