C primer plus 是本更不錯的入門書籍,講得很全面。所以這本書也比較厚,有點難啃... 系列文章參考於此書。
C Primer Plus(第五版)中文版[PDF+源代碼]下載 http://www.linuxidc.com/Linux/2012-05/60075.htm
printf() 函數基礎擴充:
想必大家的第一個C語言程序都應該是下面這個在屏幕上輸出hello world 的經典程序吧。
#include<stdio.h>
int main()
{
printf("hello world!");
}
這裡打印出的是一個字符串,當然我們也可以用printf來打印出其他參量。printf打印變量取決於參量的類型,例如在打印整數時使用%d符號,打印字符時用%c符號。這些符號叫做轉換說明,它們指定了如何把數據轉換成可顯示的形式。
切記給控制字符串後面的參數列表中的每個項目都使用一個轉換說明,也就是轉換說明要和參量一一對應,如
printf("a is %d, b is %d",a); //錯誤
printf("a is %d, b is ",a,b); //錯誤
printf("a is %d, b is %d",a,b) //正確
再而是要切記轉換說明的類型要和參量的類型相匹配
#include <stdio.h>
int main()
{
float n1 = 3.0;
double n2 = 3.0;
long n3 = 1234567890;
long n4 = 2000000000;
printf("%f %f \n",n1,n2); //正確匹配
printf("%ld %ld \n",n3,n4);
printf("%ld %ld %ld %ld\n",n1,n2,n3,n4); //錯誤匹配
}
上面代碼運行結果如下(window7環境下, 其他平台環境上可能會有不同結果)
可見第三個匹配錯誤的輸出語句顯示出了一些奇怪的數字,為什麼會出現這樣的結果呢,這個printf的輸出機制和參數傳遞機制有關
參數傳遞機制隨實現的不同而不同,下面參數傳遞是在windows系統中的工作原理,如下面的函數調用
printf("%ld %ld %ld %ld\n",n1,n2,n3,n4);
該調用告訴計算機把變量n1、n2、n3、n4的值傳遞給計算機,計算機把他們放置到堆棧的一塊內存區域中來實現。計算機根據變量的類型而非轉換說明符把這些值放到堆棧中。所以在堆棧中n1占用8個字節(當被作為printf的參數時,float被轉換為double),n2占8個字節,n3、n4分別占4個字節。
然後控制轉移到printf()函數,該函數從堆棧中把這些值讀出來,但是在讀取的時候是按照轉換說明符去讀的。%ld指出應該讀取4個字節,所以printf()在堆棧中讀取前4個字節作為他的第一個值,也就是n1的前半部分,被解釋成一個long型,下一個%ld指出再讀取4個字節作為第二個值,同理n1的後半部分也被解釋成了一個long型。同樣,%ld的第三個和第四個實例使得n2的前半部分和後半部被分別解釋成long型。所以雖然n3和n4的說明符正確,但printf()仍讀取了錯誤的字節。
printf()的返回值:
printf是有返回值的,它返回所打印的字符的數目(所有打印出的字符,包含空格,不可見的換行字符)。如果有輸出錯誤,便會返回一個負數。
其返回值是打印輸出用途的附帶功能,通常不怎麼用。使用返回值得一個可能原因是檢查輸出錯誤,常用於向文件中輸出而非向屏幕輸出的情況。