以下C代码的输出是T T,为什么不t?
问题描述:
以下C代码的输出是T T
,但我认为它应该是t t
。以下C代码的输出是T T,为什么不t?
#include<stdio.h>
#define T t
void main()
{
char T = 'T';
printf("\n%c\t%c\n",T,t);
}
答
TL; DR变量名T
受到宏替换,而不是初始化'T'
。
要精心,#define
宏导致“引号”(无论是''
或""
)内的文本替换和什么都没有宏替换的一部分。
所以在本质上,尝试在你的代码运行的预处理器(例如:gcc -E test.c
),它看起来像
char t = 'T';
printf("\n%c\t%c\n",t,t);
Run gcc -E main.c -o test.txt && tail -f test.txt
and See it online
其中,果然,打印变量t
的值 ,T T
。
也就是说,对于托管环境,main()
所需的签名至少为int main(void)
。
答
预处理器不执行引号内的任何文本替换,无论它们是单引号还是双引号。
所以字符常量'T'
不变。
从C standard第6.10.3:
形式
# define identifier replacement-list new-line
的预处理指令定义了一个类似对象的宏引起的 宏每个后续实例名称171)将被替换列表 预处理令牌替换,该预处理令牌构成的其余部分指令。然后重新扫描替换列表以获取更多宏名称,如下所述。
171)由于,通过宏观更换时间,所有字符常量和 字符串文字预处理标记,不序列可能含 类似标识符的子序列(见5.1.1.2,翻译 相),他们从不被扫描宏名称或参数。
你是不是指'T T'? – DBPriGuy
@DBPriGuy对,我的坏。部分编辑。 –
@SouravGhosh但是输出是T T而不是t t。 –