2013-07-10 115 views
1

我想出了一個代碼這是什麼「#」是在這裏做

#include <stdio.h> 

int main() 
{ 
    int i = 1427; 
    double d = 1427.0; 

    printf("%#o\n", i); 
    printf("%#X\n", i); 
    printf("\n%g\n", d); 
    printf("%#g\n", d); 
    return 0; 
} 

即給予輸出:

02623 
0X593 

1427 
1427.00 

首先我想#用於前綴0到輸出,但我錯了,因爲它在上次輸出中的奇怪行爲,它在小數點後打印零。
有人能解釋這#是什麼,它在這裏做什麼?

+7

是的,'printf()'的[documentation](http://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html)有一個很好的解釋。 – 2013-07-10 19:12:46

+3

**版主注意:**評論是爲了澄清問題,而不是進行元討論。有一個網站,或使用聊天。 http://meta.stackexchange.com/questions/19756/how-do-comments-work –

回答

8

#標誌具有不同的行爲,根據上下文。

如果它與ox,或X說明符所使用的,值前面帶有0,分別0x,或者0X

如果是用a/Ae/Ef/F,或G使用的,值總是與一個小數點結束。

此行爲在網絡上的多個地方記錄得很清楚。搜索「printf」和可能的「格式說明符」通常會形成很多良好的鏈接。這裏有幾個磨你的胃口:

+0

@Cody Gray;多謝,夥計。你提供了非常好的鏈接(特別是[這](http://msdn.microsoft.com/en-us/library/8aky45ct.aspx)幫助了很多)。我甚至不知道這是一面旗幟! – haccks

1

從POSIX手冊頁man 3p printf

#:指定值要被轉換爲另一種形式。對於o轉換,它會提高精度(如有必要),以強制 結果的第一個數字爲零。對於x或X轉換說明符,非零結果的前綴應爲0x(或0X)。對於a, A,e,E,f,F,g和G轉換說明符,結果應始終包含一個小數字符,即使沒有數字跟在基數之後。沒有這個標誌,只有在數字跟隨它時,這些轉換的結果纔會出現一個基數字符。對於g和G轉換 說明符,尾部零不得像結果一樣從結果中刪除。對於其他轉換說明符,行爲是未定義的 。

把它簡單化:它打印替代格式,無論它是什麼。爲十六進制。值,它是前綴0x,八進制0,以及浮點,它迫使一些小數規則...

1

我認爲,如果你瞭解C的printf函數here,你會能夠進一步瞭解諸如「#」等內容。

與o,x或X說明符一起使用時,對於不同於零的值,值分別先於0,0x或0X 。與a,A,e,E,f一起使用, F,g或G會強制寫入的輸出包含一個小數點,如果沒有更多數字出現,即使爲 。默認情況下,如果沒有數字,則不寫入小數點 。從wikipedia

1

Exerpt:

#替換形式。對於'g'和'G',尾部零不會被刪除。對於'f','F','e','E','g','G',輸出總是包含一個小數點。對於'o','x'和'X',分別爲0,0x和0X的前綴爲非零數字。

0

%#o(Octal)0前綴插入。

%#x(十六進制)0x前綴添加到非零值。

%X(十六進制)0X前綴添加到非零值。

%g總是顯示小數點後 零不被刪除。

因爲您正在使用%#g,所以零必然會出現在小數點後面。