单引号和双引号:

 

下面的程序片段合法吗?

 

示例程序:

 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('\n');
13     printf("\n");
14     
15     return 0;
16 }

编译运行结果如下:

 

小贴士:

 

上面程序产生错误的原因:

 

低于0x08048000的地址是不能随便访问的。

printf('\n')会产生段错误,因为printf把'\n'的aisc码当成了地址。aisc码为0x00000010。

如下:

 

混淆概念的代码示例:

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5 
 6     char c = " ";
 7     
 8     while( (c == "\t") || (c == " ") || (c == "\n") )
 9     {
10         scanf("%c", &c);
11     }
12     
13     return 0;
14 }

编译运行结果如下:

 

while循环没有得到执行。

第6行将字符串的地址赋值给了c。

 

赋值给c的地址值发生了截断,所以第8行的判断中c的值是不会等于" "字符串的地址的。

将程序中的双引号改为单引号就可以得到预期的效果了。

小结:

  单引号括起来的单个字符代表整数

  双引号括起来的字符代表字符指针

  C编译器接受字符和字符串的比较,无任何意义

  C编译器允许字符串对字符变量赋值,只能得到错误

 

posted on 2018-08-25 21:14  周伯通789  阅读(733)  评论(0编辑  收藏  举报