eg0
char ch1, ch2; ch1 = 'a'; ch2 = "a"; printf("ch1 = *%c*", ch1); printf("ch2 = *%c*", ch2);
编译结果
first.cpp: In function 'int main()': first.cpp:12:8: error: invalid conversion from 'const char*' to 'char' [-fpermissive] ch2 = "a";
编译器说,ch2="a",这条语句是把一个const char*类型的值,赋值给了一个,char类型的变量,不可行。
那我们把ch2声明为char*试试。
char ch1; char *ch2; ch1 = 'a'; ch2 = "a"; printf("ch1 = *%c*\n", ch1); printf("ch2 = *%c*", ch2);
运行结果
first.cpp: In function 'int main()': first.cpp:19:8: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] ch2 = "a"; ^~~ ch1 = *a* ch2 = **
编译通过了,但是运行时出现了warning。编译器说,C++不支持把一个字符串常量转化成一个char*。
如果把文件后缀由cpp改为c试试。
ch1 = *a* ch2 = **
正常显示。
单引号表示char,双引号表示char*
eg1
char ch = 'a', b, g; int i = 1; printf("b = *%c*\n", b); printf("g = *%c*\n", g); printf("ch = *%c*", ch);
运行结果
b = ** g = ** ch = *a*
ch做了初始化,输出a很合理,b和g没有做初始化,什么也没有输出。
把b和g都赋值成‘\0’试试。
char ch = 'a', b = '\0', g = '\0'; int i = 1; printf("b = *%c*\n", b); printf("g = *%c*\n", g); printf("ch = *%c*", ch);
运行结果
b = ** g = ** ch = *a*
由此可知,不做初始化操作,编译器会自动为字符型变量赋值为‘\0’。
’\0‘的显示形式不唯一,由不同的编译器而决定,例如同样的代码,在dev c++中运行结果如下。
b = * * g = * * ch = *a*
char类型变量如若不做初始化,编译器会自动赋值为'\0'
eg3
代码段
char ch0 = '65'; char ch1 = 'a'; char ch2 = 'abcd'; char ch3 = 65; char ch4 = -1; printf("ch0 = *%c*\n", ch0); printf("ch1 = *%c*\n", ch1); printf("ch2 = *%c*\n", ch2); printf("ch3 = *%c*\n", ch3); printf("ch4 = *%c*\n", ch4);
运行结果
first.cpp:6:13: warning: multi-character character constant [-Wmultichar] char ch0 = '65'; ^~~~ first.cpp:8:13: warning: multi-character character constant [-Wmultichar] char ch2 = 'abcd'; ^~~~~~ first.cpp: In function 'int main()': first.cpp:6:13: warning: overflow in conversion from 'int' to 'char' changes value from '13877' to ''5'' [-Woverflow] char ch0 = '65'; ^~~~ first.cpp:8:13: warning: overflow in conversion from 'int' to 'char' changes value from '1633837924' to ''d'' [-Woverflow] char ch2 = 'abcd'; ^~~~~~ ch0 = *5* ch1 = *a* ch2 = *d* ch3 = *A* ch4 = **
单引号里面字符数量如果超过1个,首先编译器会给出warning,然后实际存储时,会把单引号中最后一个字符赋值给字符型变量。
每一个字符都对应着一个唯一的ascii码,如果赋值号右边是整型且在ascii码的有效范围内,则变量将会被赋值为该整型数值在ascii表中所对应的字符,若超出了合法范围,则会输出一个错误的值(不输出任何值)。
单引号里面带一个字符->整型;双引号里面带字符串->指针。