C陷阱與缺陷》中的printf

2021-06-19 06:07:51 字數 2595 閱讀 2087

1. 格式符

%g, %f, %e這3個格式項用於列印浮點值。%g格式項用於列印那些不需要按列對齊的浮點數特別有用。它在列印出對應的數值時,會去掉該數值尾綴的零,保留6位有效數字

printf("pi = %g\n", 4 * atan(1.0));

pi = 3.14159  (共6位有效數字,不包括小數點和字首0)

printf("%g %g %g %g %g\n", 1/1.0, 1/2.0, 1/3.0, 1/4.0, 0.0);

將列印出1 0.5 0.333333 0.25 0  (注意0.3333333共6位有效數字,不包括字首0和小數點)

printf("%g\n", 2/3.0); => 0.666667  (數值進行四捨五入)

如果乙個數的絕對值大於999999,按%g的格式列印出這個數將會超過6位有效數字,故它會採用科學計數法的方法列印。

printf("%g\n", 123456789.0); => 1.23457e+08  (基數部分有6位有效數字)

對於比較小的數值,除非該數的指數小於或等於-5,%g格式項才會採用科學計數法來表示。因此

printf("%g %g %g\n", 3.14159e-3, 3.14159e-4, 3.14159e-5);

=> 0.00314159 0.000314159 3.14159e-5

%e格式項用於列印浮點數,要求一律顯式地使用指數形式:pi在使用%e格式項時將被寫成3.141593e+00。%e格式項將列印出小數點後6位有效數字,而並非如%g格式項列印出的數總共6位有效數字。

%f跟%e一樣,即小數點後6位有效數字。

2. 修飾符

printf函式也接受輔助字元來修飾乙個格式項的含義。這些輔助字元出現在%符號和後面的格式碼之間。

整數有3種不同型別,對應3種不同長度: short,long和正常長度。如果乙個short整數作為任何乙個函式的引數出現,它會被自動的擴充套件為乙個正常長度的整數。(k&r c)

寬度修飾符對所有的格式碼都有效,甚至%%也不例外。因此,例如printf(%8%\n"); 8個%

精度修飾符的作用是控制乙個數值的表示中將要出現的數字位數,或者用於限制將要列印的字串中應該出現的字元數。精度修飾符包括乙個小數點,和小數點後面的一串數字。精度修飾符出現在%符號和寬度修飾符之後,格式碼與長度修飾符之前。

1) 對於整數格式項%d, %o, %x和%u,精度修飾符指定了列印數字的最小位數。如果不夠位數,則會自動補0

printf(%.2d/%.2d/%.4d\n", 7, 14, 1789); => 07/14/1789

2) 對於%e, %e, 和%f格式項,精度修飾符指定了小數點後應該出現的數字位數

3) 對於%g和%g格式項,精度修飾符指定了列印數值中的有效數字位數。除非另有說明,非有效數字的0將被去除,如果小數點後不跟數字則小數點也被刪除。

printf("%.1g %.2g %.4g %.8g\n", 10/3.0, 10/3.0, 10/3.0, 10/3.0);

=> 3 3.3 3.333 3.333333

4) 對於%c和%%格式項,精度修飾符將被忽略

3. 標誌

1) 『-』操作,左對齊

2) '+'操作,規定每個待列印的數值在輸出時都應該以它的符號作為第乙個字元。故正數會列印「+」, 負數會列印「-",0則不輸出。

3) 空白字元作為標誌字元時,含義是如果某數是乙個非負數,就在它前面插入乙個空白字元。如果標誌字元+和空白字元同時出現乙個格式項中,最終的效果是以標誌字元+為準。

for (int i = -3; i <= 3; i++) 

printf("% d\n", i); -3

-2 -1

0 12 3

4. 可變域寬與精度

printf("%*.*s\n", 12, 5, str);

這個式子將列印出字串str的前5個字元或更少,前面將填充若干空白字元以達到總共列印12個字元的要求。

printf("%*%\n", n);

上式將在寬度為n個字元的域內以右端對齊的方式列印出乙個%符號。換言之,先列印n-1個空白字元,後面再跟乙個%符號。

varargs.h中的巨集實現(k&r c)

typdef char* va_list;

#define va_dcl int va_alist;

#define va_start(list) list = (char*)&va_alist

#define va_end(list)

#define va_arg(list, mode) \

((mode *)(list += sizeof(mode)))[-1]

#include

void error(va_alist) va_dcl

int printf(va_alist) va_dcl

c陷阱與缺陷 陷阱

例1 if x y break 這就話的意思就是把y賦值x,判斷x是否為0,實則是在判斷y是否為0 例2 while c c t c n 這句話的意思就是 c t c n 賦值給c,而有 符本身就是不為0的數,所以這就是while 1 的意思。例3 int x 4,p new int p 2 cou...

C陷阱與缺陷

c語言對於符號 包含乙個或多個字元 的識別規則 每乙個符號應該包含盡可能多的字元。也就是說,編譯器將程式分解成符號的方法是,從左到右乙個字元乙個字元地讀入,如果該字元可能組成乙個符號,那麼再讀入下乙個字元,判斷已經讀入的兩個字元組成的字串是否可能是乙個符號的組成部分 如果可能,繼續讀入下乙個字元,重...

C陷阱與缺陷

1.int num 10 測試一下 num 0 是否 等於 0 num 因為num是首位址 num 0 0 num 2.其實c中只有一維陣列 我們所說的 int a 3 4 只是乙個包含了三個元素 每個元素都是包含了四個整形值的一維陣列 3.int num 10 10 int p num 0 名為n...