1. 程式人生 > >C語言中printf函式對多個引數的計算順序和輸出順序

C語言中printf函式對多個引數的計算順序和輸出順序

例:

[cpp] view plain copy print?
  1. #include<stdio.h> 
  2. void main()   
  3. {   
  4.     int i=2;   
  5.     printf(”%d,%d,%d,%d,\n”,i++,++i,i,i++);   
  6.     printf(”%d\n”,i);   
  7. }   
#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?
  1. #include <stdio.h> 
  2. void main()   
  3. {   
  4.        int a=5,b=2;  
  5.        printf(”%d %d\n”,b=a+1,a=a+1);  
  6. }  
#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++);