单引号和双引号:
下面的程序片段合法吗?
示例程序:
1 #include <stdio.h> 2 3 int main() 4 { 5 6 char* p1 = 1 ; 7 char* p2 = '1'; 8 char* p3 = "1"; 9 10 printf("%s, %s, %s", p1, p2, p3); 11 12 printf(' '); 13 printf(" "); 14 15 return 0; 16 }
编译运行结果如下:
小贴士:
上面程序产生错误的原因:
低于0x08048000的地址是不能随便访问的。
printf(' ')会产生段错误,因为printf把' '的aisc码当成了地址。aisc码为0x00000010。
如下:
混淆概念的代码示例:
1 #include <stdio.h> 2 3 int main() 4 { 5 6 char c = " "; 7 8 while( (c == " ") || (c == " ") || (c == " ") ) 9 { 10 scanf("%c", &c); 11 } 12 13 return 0; 14 }
编译运行结果如下:
while循环没有得到执行。
第6行将字符串的地址赋值给了c。
赋值给c的地址值发生了截断,所以第8行的判断中c的值是不会等于" "字符串的地址的。
将程序中的双引号改为单引号就可以得到预期的效果了。
小结:
单引号括起来的单个字符代表整数
双引号括起来的字符代表字符指针
C编译器接受字符和字符串的比较,无任何意义
C编译器允许字符串对字符变量赋值,只能得到错误