C语言中char变量用双引号赋值为何未报错且输出异常?
拆解你的C语言代码问题
让我一步步帮你搞懂这里面的门道:
1. 为什么char x = "A";会出现奇怪的输出?
首先得搞清楚字符串字面量和字符字面量的本质区别:
"A"是字符串字面量,它在程序运行时会被存在内存里,实际是一个包含两个字符的数组:'A'加上字符串终止符'\0'。更关键的是,当你直接写"A"的时候,它代表的是这个数组的首地址,也就是一个char*类型的指针。- 而
x是char类型的变量,它只能存1字节的整数(要么是ASCII值,要么是小范围整数)。
所以char x = "A";其实是把字符串"A"所在的内存地址,截断成1字节(char的标准大小)后赋值给了x。你用%d输出得到4,说明在你的系统里,这个地址的最低字节数值就是4。而ASCII码4是一个不可见的控制字符(EOT,传输结束符),终端没法显示这类字符,就会用问号或者方块这类占位符号代替。
2. 为什么这段代码没触发编译报错?
C语言允许指针类型和整数类型之间的隐式转换(虽然这是非常危险的行为)。大多数编译器默认只会给你一个警告(比如GCC会提示“initialization makes integer from pointer without a cast”),但警告不等于错误——只要没有语法层面的错误,编译器就会生成可执行文件。
如果开启严格编译选项(比如-Werror),编译器就会把这个警告当成错误,直接阻止编译通过。
3. 换成'A'为什么就正常了?
'A'是字符字面量,它的本质就是整数——对应ASCII码里的65。把它赋值给char类型的x,x就直接存储了65这个值:
- 用
%c格式符输出时,会把65转换成对应的ASCII字符'A'; - 用
%d格式符输出时,直接输出这个整数65,完全符合预期。
内容的提问来源于stack exchange,提问作者Sourabh Bhattacharya
相关产品推荐
相关产品推荐

