黑马程序员技术交流社区

标题: 关于char类型使用注意和break退出问题? [打印本页]

作者: 远人    时间: 2014-3-26 10:39
标题: 关于char类型使用注意和break退出问题?
本帖最后由 远人 于 2014-4-4 13:14 编辑
  1. #include <stdio.h>

  2. int main(int argc, const char * argv[])
  3. {
  4.     char c = 'A';
  5.    
  6.     switch (c) {
  7.         case 'A':
  8.             printf("1\n");
  9.             break;
  10.         case 65:
  11.             printf("2\n");
  12.             break;
  13.         default:
  14.             printf("3\n");
  15.             break;
  16.     }
  17.     return 0;
  18. }
复制代码


这是老师讲解函数内存剖析中char类型使用注意事项的一个问题。
老师说第一个case'A'和第二个case65重复,所以报错。
我想问的是:这段代码编译语法没问题,编译通过,那么以前老师讲过,当运行第一个case'A'正确完毕时,这里的break就会退出整个函数,就不会运行第二个case65,那为什么这里运行会失败?
作者: agelessman    时间: 2014-3-26 10:46
一开始的编译,电脑只会对你写的语法进行检查,第二部进行链接时就会报错,不然,你要是在程序里写了无数个错误,上边弄个break。程序还能运行。
作者: 程浩    时间: 2014-3-26 12:59
本帖最后由 程浩 于 2014-3-26 13:03 编辑

你要去上厕所,有三个门,一个男,一个男,一个女(假如你是男滴)
1.不管你是进第一个还是第二个男厕所,都是错的,因为你根本就不知道选哪个
2.就算你是顺序查看,刚好第一个是对的,那第二个在switch的时候也是对的,但你上完第一个厕所就走了,第二个没去,这也是错的

所以最好还是找一男一女的厕所
作者: 远人    时间: 2014-3-26 14:56
agelessman 发表于 2014-3-26 10:46
一开始的编译,电脑只会对你写的语法进行检查,第二部进行链接时就会报错,不然,你要是在程序里写了无数个 ...

链接出错?
能详细解释下不?
作者: 菜鸟de无奈    时间: 2014-3-26 16:55
远人 发表于 2014-3-26 14:56
链接出错?
能详细解释下不?

运行的前提,首先编译成功,再链接成功才可以。

你直接编译只是检查语法,且C是弱语法,不好判断是否能运行。
作者: 高伟杰    时间: 2014-3-26 18:53
switch语句中的每一个case必须有一个唯一的常量表达式值,且这个值不能在switch的各级语句中出现多次
作为char类型的时候,'A'和65等值,所以编译器报错。
建议:编译报错时,可以查询下error后面给出的讯息,会对独立解决问题有帮助。
作者: Jine    时间: 2014-3-27 22:18
这个想法是我自己猜的,错了不要痛批!

因为’A‘的ASCII的值是65,而计算机最彻底的编译是数值。

switch是接受整数的,所以在switch中’A‘==65
switch中不能有两个相同case的条件
作者: 那个Mr_Z    时间: 2014-4-2 12:32
你编译的时候,编译器会首先检查语法,语法错了,程序运行不了自然会报错
作者: Freedam    时间: 2014-4-2 14:20
这段程序在编译的时候就已经出错了,还没到链接那步就不行了。
虽然在编译的时候预处理没有问题,都能通过,但是在编译的最后一步汇编时出错了。
cc -E char.c -o char.i预处理通过

cc -S char.i -o char.s
char.c: In function ‘main’:
char.c:17: error: duplicate case value
char.c:15: error: previously used here汇编时就已经告诉你出错原因是case值有重复 并告诉你出错行数了
链接是链接系统库或是函数库,因为编译就有错误如果直接这样链接库也是一样直接报错。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2