[英]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
並在線查看
預計會打印變量t
, TT
的值 。
也就是說,對於托管環境, main()
所需的簽名至少是int main(void)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.