簡體   English   中英

以下C代碼的輸出是TT,為什么不tt?

[英]The output of the following C code is T T , why not t t?

以下C代碼的輸出是TT ,但我認為它應該是tt

#include<stdio.h>
#define T t
void main()
{
     char T = 'T';
     printf("\n%c\t%c\n",T,t);
}

預處理器不會對引號內的任何文本執行替換,無論它們是單引號還是雙引號。

所以字符常量'T'不變。

C標准的 6.10.3節:

9表單的預處理指令

 # define identifier replacement-list new-line 

定義一個類似對象的宏,它使宏名稱171)的每個后續實例被構成指令其余部分的預處理標記的替換列表替換。 然后重新掃描替換列表以獲取更多宏名稱,如下所示。

171)由於宏替換時間, 所有字符常量和字符串文字都是預處理標記 ,而不是可能包含類似標識符的子序列的序列(見5.1.1.2,翻譯階段), 因此永遠不會掃描它們的宏名稱或參數。

TL; DR變量名T受MACRO替換,而不是初始化'T'


詳細來說#define宏導致“引號”( 無論是內部的文本替換和什么''"" )不是宏替換的一部分。

所以本質上,嘗試在代碼上運行預處理器(例如: gcc -E test.c ),它看起來像

 char t = 'T';
 printf("\n%c\t%c\n",t,t);

運行gcc -E main.c -o test.txt && tail -f test.txt在線查看

預計會打印變量tTT

也就是說,對於托管環境, main()所需的簽名至少是int main(void)

暫無
暫無

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

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