C語言中printf函式對多個引數的計算順序和輸出順序
例:
[cpp] view plain copy print?- #include<stdio.h>
- void main()
- {
- int i=2;
- printf(”%d,%d,%d,%d,\n”,i++,++i,i,i++);
- printf(”%d\n”,i);
- }
#include<stdio.h>
void main()
{
int i=2;
printf("%d,%d,%d,%d,\n",i++,++i,i,i++);
printf("%d\n",i);
}
首先,應該說明的是在不同的編譯環境中結果是不一樣的。
關於本段程式碼在VC++6.0中的規則如下:
1、printf函式的執行順序是由右到左的
2、前自增運算子(++i)先加1,再使用i,此時i已經加了1;
3、後自增運算子(i++)先使用i,再加1,***注意這裡是關鍵所在,VC++6.0後自增運算是要在整條語句結束以後才自加1的!
所以:
printf(“%d,%d,%d,%d,\n”,i++,++i,i,i++);
從右往左運算:
i++得到2(i=2,後加1在整條語句執行完才進行,這裡先記下)
i還是2 (i=2,原因見上一行)
++i得到3(i=3,先加1,後使用)
i++得到3(i=3,後加1在整條語句執行完才進行,這裡先記下)
所以輸出結果為:3,3,2,2
然後計算剛才的兩次後自增運算後,i=5
printf(“%d\n”,i);
所以,結果是5
———————————————————————————–
關於下面的程式:
[cpp] view plain copy print?- #include <stdio.h>
- void main()
- {
- int a=5,b=2;
- printf(”%d %d\n”,b=a+1,a=a+1);
- }
#include <stdio.h>
void main()
{
int a=5,b=2;
printf("%d %d\n",b=a+1,a=a+1);
}
輸出結果是:7 6
而不是:6 6
這是因為printf函式的計算是從右向左進行的。
另外關於下面程式的解釋:
int i=7; printf(”%d\n“,
i++ * i++);
輸出結果是:49而不是56
int i=7;printf(“%d %d\n”,++i,i++);
輸出結果是:8 7而不是9,7 這並不違背分割新上面關於printf函式從右向左計算的原因。
總結:到這裡,要掌握的是兩點,
一是:printf函式中的計算是從右向左進行的。
二是:我們在寫程式碼時,應該儘量避免類似下面的無確定意義的表示式出現,因為很有可能不同的編譯器,會採用不同的理解方式。
例如:
a+=a++;
a[i]=i++;
printf(“%d %d\n”,++i,i++);