2016-09-19 21 views
0

我有以下程序。格式說明符如何知道要打印多少個字節?

#include<stdio.h> 
int main() 
{ 
    char a='b'; 
    int b=11299; 
    char d[4]="abc"; 
    printf("value of a is %d\n",a); 
    printf("value of b is %c\n",b); 
    printf("value of c is %d\n",*d); 
    char *c=d; 
    c=c+1; 
    printf("c is %d\n",*c); 
} 

我很困惑%d格式說明符。我在想它會打印4個字節的數據。但是從上面的程序(第一個和最後一個printf)可以看出,當使用char參數時,它只能打印一個字節。爲什麼%d只打印一個字節?它如何知道要打印多少個字節?

+0

這是[基本MSVC頁](https://msdn.microsoft.com/en-us/library/56e442dc.aspx)約'printf'格式說明符,幷包含更多詳細信息的鏈接,例如寬度。普通的'%d'說明符根據需要使用盡可能多的數字將給定的參數打印爲「int」。 –

+0

當'a'被傳遞給'printf()'時,它被編譯器提升爲'int'。 – alk

+0

'char'被提升爲'int'。 –

回答

3

它不打印字節;它會打印值 - 作爲相應參數傳遞的值 - 只要傳遞的值具有正確的類型。

在你的例子1中,參數是值'b'。它最初具有類型char(因爲表達式a的類型爲char),但可變參數受制於默認促銷,其促進了具有比intint更低級別的任何整數類型。因此,作爲參數,類型是int

在你的例子3中,參數是值'a'。同樣,它最初的類型爲char(因爲表達式*d的類型爲char),但它被提升爲int

如果沒有發生促銷並且類型錯誤,但printf仍然不會「打印更少的字節」。你的程序只會有未定義的行爲(所以任何事情都可能發生)。例如:

int a = 42; 
printf("%lld\n", a); // undefined behavior because int does not 
        // get promoted implicitly to long long. 

在您的例子2中,%c格式說明預計int類型的參數; printf將其轉換爲unsigned char並打印相應的字符。任何值int都可以接受;它不一定是在unsigned char範圍內的值。

0

首先,您可能聲明瞭指定ISO C90,並且這會禁止混合聲明和代碼,如警告中所示。 必須使用語句字符串dchar d [4] = "abc";而不是代碼中間的語句類型爲char c varible char * c = d;的語句指針。 第二:int main(){函數不返回任何東西,但是這必須指定不拉警告。

訂正方案將是:

#include<stdio.h> 
int main() 
{ 
    char a='b'; 
    int b=11299; 
    char d[4]="abc"; 
    char *c=d; 
    printf("value of a is %d\n",a); 
    printf("value of b is %c\n",b); 
    printf("value of c is %d\n",*d); 
    c=c+1; 
    printf("c is %d\n",*c); 
    return 0; 
} 
+0

錯誤,這是如何回答這個問題的? – alk