原文視頻:https://v.qq.com/x/page/c0508n4lwzm.html
問:下面代碼會輸出什麼?
intmain(void)
{
int a = 10, b = 20, c = 30;
printf("\n %d..%d..%d \n", a+b+c,(b = b*2), (c = c*2));
return 0;
}
本題解析
答:輸出結果是:
110..40..60
這道題目來說的話,許多同學感覺無從下手,所以沒法回答。或者是有同學會認為是60..40..60這樣的答案,那麼需要注意的是,對於c語言來說,printf函數輸出雖然是自左向右輸出,但是計算的話,卻是從右向左計算的。
也就是先計算c = c* 2的結果,再計算b = b * 2的結果,最後計算a + b + c 的結果。
但是強烈建議,大家不要再printf函數中像這樣去寫,因為這樣會增加代碼閱讀的困難度,有可能會讓你的同事閱讀你的代碼的時候壓制不住心中打你的衝動。
相關知識點
對於printf函數,考點還是非常多的,比如說浮點數的輸出,或者類型不符的輸出。
浮點數
浮點數輸出:
如下程序,將會輸出什麼結果?
#include <stdio.h>
int main()
{
float num = 13.48932f;
printf("%2.2f\n",num);
return 0;
}
答案:13.49
對于格式化輸出控制字符串來說,%2.2f,小數點後的2代表小數點後保留的位數,需要注意的是,這裡的保留時採用四捨五入的。
小數點前的2代表輸出的總寬度,包含小數點在內,但是如果不能夠將有效的數據完全輸出出來的話,則不起作用的。
在本例中,浮點數13.48932,小數點後保留兩位,是13.49,輸出位共5位,所以小數點前的2是不起作用的。
類型不符的輸出
所謂類型不符的輸出,就是前面的格式化控制字符串中聲明的數據類型,與實參給出的數據類型不匹配的情形。
如:
int a =20;
printf("%s\n",a);
對於類型不符的輸出的處理,其實是比較複雜的;
如上例中的輸出如果換做下面的形式:
#include<stdio.h>
int main()
{
float num = 13.48932f;
printf("%d\n",num);
return 0;
}
輸出的結果就是:670084616
而且這個值有時候運行起來是不一樣的。
原因在於,printf並不會進行自動類型轉換,printf後邊的變量以棧的方式存儲,而%f、%d等轉換說明符的操作方式是從棧中讀取該符號對應數據類型的字節數,並不關心後邊對應的數據類型具體是什麼。
因為在內存中,浮點數是以指數冪的形式進行存儲的,所以如果直接讀取內存中數據按照十進位顯示出來的話,就會出現這樣的情況。
為了保證正確的輸出,可以在輸出前轉換數據類型,這樣不會有問題!如:
#include<stdio.h>
int main()
{
float num = 13.48932f;
printf("%d\n",(int)num);
return 0;
}
輸出的結果就是:13
總結一下,printf語句一定要注意輸出格式和變量類型的匹配,不然會出現莫名奇妙的錯誤。