先判断下面的代码:
char str1[] = "\0123";
printf("size = %d\n", sizeof(str1));可能你会大声的说出:5
有可能你的理由是:
第一个:\
第二个:0
第三个:1
第四个:2
第五个:3还有可能你的理由是:
第一个:\0
第二个:1
第三个:2
第四个:3
第五个:\0如果你的理由是最上面那个,那么你应该把C语言基础书好好看一篇。
而正确答案是:3
下面来讲一下C语言初始化关于“ \ ”后面的数字的问题
第一条规则:字符“ \ ”后面的数字会以八进制的形式赋值
char str1[] = "\1081";
for (int i = 0; str1[i]; ++i)
cout<<(int)str1[i]<<" ";
printf("size = %d\n", sizeof(str1));输出:8 56 49 size = 4
- \10:表示八进制的10,转换为十进制后,变为8
- 后面的数字,依次是字符“ 8 ”,字符“ 1 ”
第二条规则:字符“ \ ”后面的数字不能大于7,否则原样转换
char str1[] = "\876";
for (int i = 0; str1[i]; ++i)
cout<<(int)str1[i]<<" ";
printf("size = %d\n", sizeof(str1));输出:56 55 54 size = 4
依次是字符“ 8 ”,字符“ 7 ”,字符“ 6 ”
第三条规则:字符“ \ ”后面的数字个数不会多余3个
char str1[] = "\1111";
for (int i = 0; str1[i]; ++i)
cout<<(int)str1[i]<<" ";
printf("size = %d\n", sizeof(str1));输出:73 49 size = 3
第四条规则:3个以内的字符只要有树大于7,就会停止转换
char str1[] = "\1111";
for (int i = 0; str1[i]; ++i)
cout<<(int)str1[i]<<" ";
printf("size = %d\n", sizeof(str1));输出:9 56 55 size = 4
\11:转为十进制的9
第五条规则:3个的数的数字(转为十进制)大于127,那么就会变为负数,因为有符号char的范围(-128 ~ 127)
char str1[] = "\200";
for (int i = 0; str1[i]; ++i)
cout<<(int)str1[i]<<" ";
printf("size = %d\n", sizeof(str1));输出:-1 size = 2
\200:转换为十进制为128,但是有符号字符不能大于127,只有负0(-128)
第6条规则:3个的数的数字(转为十进制)大于255,那么高位会被裁剪
char str1[] = "\377";
for (int i = 0; str1[i]; ++i)
cout<<(int)str1[i]<<" ";
printf("size = %d\n", sizeof(str1));输出:-1 size = 2
\377:转换为十进制为255
char str1[] = "\777";
for (int i = 0; str1[i]; ++i)
cout<<(int)str1[i]<<" ";
printf("size = %d\n", sizeof(str1));输出:-1 size = 2
\777:裁剪后再转换为十进制为255
第7条规则:如果" \ "不是数字,那么有时候转换后的值也不是对应的字符
char str1[] = "\A";//65 size = 2
char str1[] = "\B";//66 size = 2
char str1[] = "\C";//67 size = 2
char str1[] = "\D";//68 size = 2
char str1[] = "\E";//27 size = 2
char str1[] = "\F";//70 size = 2
char str1[] = "\G";//71 size = 2
char str1[] = "\a";//7 size = 2
char str1[] = "\b";//8 size = 2
char str1[] = "\c";//99 size = 2
char str1[] = "\d";//100 size = 2
char str1[] = "\e";//27 size = 2
char str1[] = "\f";//12 ize = 2
char str1[] = "\g";//103 size = 2\E、\a、\b、\e、\f:其实都会变为特殊字符,这个是编译器的问题,不用去记住,知道就好
总结:
- 字符“ \ ”后面的数字会以八进制的形式赋值
- 字符“ \ ”后面的数字不能大于7,否则原样转换
- 字符“ \ ”后面的数字个数不会多余3个
- 3个以内的字符只要有树大于7,就会停止转换
- 3个的数的数字(转为十进制)大于127,那么就会变为负数,因为有符号char的范围(-128 ~ 127)
- 3个的数的数字(转为十进制)大于255,那么高位会被裁剪
- 如果" \ "不是数字,那么有时候转换后的值也不是对应的字符
版权声明:本文为QQ2558030393原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。