一直以来, 我总是以为char str1[11] = "12345\06789";和char str2[11] = {'1', '2', '3', '4', '5', '\0', '6', '7', '8', '9', '\0'};是完全等价的。直到今天调试一个程序, 我才发现, 他们原来是不等价的, 我被这个问题蒙在鼓里, 看来有必要深入看看。
我一直苦苦思索原来程序产生的异常, 一直找不到原因, 我想, 如果实在是异常, 那就是str1和str2不等价, 而自以为深厚的C语言功底告诉我: str1和str2是绝对等价的。不过, 最后种种迹象都表明,str1和str2不等价。 于是, 我不得不怀疑str1和str2的等价性, 且看程序:
#include <stdio.h>
int main()
{
char str1[11] = "12345\06789";
printf("%s\n", str1); // 居然是12345789
int i = 0;
for(i = 0; i < 11; i++)
{
printf("%d\n", str1[i] - '0');
}
char str2[11] = {'1', '2', '3', '4', '5', '\0', '6', '7', '8', '9', '\0'};
printf("%s\n", str2); // 12345
for(i = 0; i < 11; i++)
{
printf("%d\n", str2[i] - '0');
}
return 0;
}
原来, str1和str2确实不等价。 为什么呢? 查资料才知道‘\067’是一个字符


好了, 终于找到了问题的本质原因了。 看来, 程序猿不能盲目自信啊, 大胆假设, 小心求证。 敢于怀疑看似正常的东西。 最后以一个小程序结尾本文:
#include <stdio.h>
int main()
{
if('\067' == '7')
{
printf("yes\n"); // yes
}
else
{
printf("no\n");
}
printf("%d\n", '\012'); // 10
printf("%d\n", '\034'); // 28
return 0;
}