簡體   English   中英

將字符串文字作為參數傳遞給打印 function 而不使用任何格式說明符?

[英]Pass string literal as the argument to the print function with out any format specifier?

為什么即使我沒有傳遞任何格式說明符而是傳遞字符串文字,我也沒有收到錯誤。 字符串文字的情況下沒有錯誤,但字符的情況下有錯誤,integer。 為什么?

#include<stdio.h>
int main()
{
   printf("Hello World");
   return 0;
}

printf的第一個參數應該是格式字符串1 "Hello World"是格式字符串2

根據 C 2018 標准中的第 7.21.6.1 3 段,格式字符串由零個或多個指令組成:

  • 一個%字符開始一個轉換規范的指令。
  • 任何其他字符都是對 output 的指令,該字符不變。

所以"Hello World"是一個格式字符串,表示打印“H”、“e”、“l”、“l”、“o”、“”、“W”、“o”、“r”、“l ”和“d”。 它只是一個只有普通字符的格式字符串,沒有轉換規范。 它是printf的第一個參數的正確類型和數據,因此不會出現錯誤。

相反,當charint作為第一個參數傳遞給printf時,編譯器知道它是錯誤的參數類型並發出警告或錯誤消息。

腳注

1從技術上講,參數應該是指向格式字符串第一個字符的指針。

2 "Hello World"作為指針傳遞,因為雖然它是一個字符數組,但它會自動轉換為指向其第一個字符的指針。

printf上的文檔如下:

int printf ( const char * format, ... );

將格式化數據打印到 stdout 將 format 指向的 C 字符串寫入標准 output (stdout)。 如果 format 包含格式說明符(以 % 開頭的子序列),則格式后面的附加 arguments 將被格式化並插入到結果字符串中,替換它們各自的說明符。 將 char 或 int 變量代替上面的格式將失敗

在 C11 到 select 中引入的預處理器和通用選擇的幫助下,可以根據參數類型生成正確的格式字符串。

嘗試:

#define FMT(X) _Generic(X, int: "%d", char*: "%s", float: "%f") 
#define print(X) printf(FMT(X), (X))

現在程序:

int main() {
   print(1);
   print("abc");
   print(3.0f);
   return 0;
}

產生預期的 output 為1abc3.00000

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM