#include <stdio.h>
int main(void){
char a;
a = 'string';
printf("%c", a);
}
输出的结果如下:
PS C:\Users\13255\Desktop\C语言基础> cd "c:\Users\13255\Desktop\C语言基础\3.正片开始\" ; if ($?) { gcc char能给string吗.c -o char能给string吗 } ; if ($?) { .\char能给string吗 }
char能给string吗.c: In function 'main':
char能给string吗.c:5:9: warning: character constant too long for its type
a = 'string';
^~~~~~~~
char能给string吗.c:5:9: warning: overflow in conversion from 'int' to 'char' changes value from '1919512167' to
'103' [-Woverflow]
g
我们看到, 它最终还是输出了g, 为什么会输出最后一个字符呢?
参考书籍<C Primer Plus>可知(原文第51页), 一个字符占8位字节, 单引号括住的统一看成字符, 无论它是否是单字符, 然后c语言会把字符统一转换成int类型, 也就是32位, 每个字符占8位, 因为char类型只能接收8位, 所以会把最后的8位赋给char类型变量a, 最终输出g
那问题来了, 是不是printf中的%c的影响而只能输出最后那个字符呢?我绝对应该不是的, 因为vscode它直接报错, 什么也不输出, 参考以下代码:
#include <stdio.h>
int main(void){
char a;
a = 'string';
printf("%s", a);
}
直接报错结果为:
PS C:\Users\13255\Desktop\C语言基础> cd "c:\Users\13255\Desktop\C语言基础\3.正片开始\" ; if ($?) { gcc char能给string吗.c -o char能给string吗 } ; if ($?) { .\char能给string吗 }
char能给string吗.c: In function 'main':
char能给string吗.c:5:9: warning: character constant too long for its type
a = 'string';
^~~~~~~~
char能给string吗.c:5:9: warning: overflow in conversion from 'int' to 'char' changes value from '1919512167' to
'103' [-Woverflow]
那用%d输出看看, 为了证明这个char类型值他的代表数:
#include <stdio.h>
int main(void){
char a;
a = 'string';
printf("%d\n", a);
printf("字符g的ascii码为: %d", 'g');
}
输出结果如下, 可以发现, c早就已经帮我们处理好了, 这个char类型的a变量已经自动处理成最后一个字符g:
PS C:\Users\13255\Desktop\C语言基础> cd "c:\Users\13255\Desktop\C语言基础\3.正片开始\" ; if ($?) { gcc char能给string吗.c -o char能给string吗 } ; if ($?) { .\char能给string吗 }
char能给string吗.c: In function 'main':
char能给string吗.c:5:9: warning: character constant too long for its type
a = 'string';
^~~~~~~~
char能给string吗.c:5:9: warning: overflow in conversion from 'int' to 'char' changes value from '1919512167' to
'103' [-Woverflow]
103
字符g的ascii码为: 103