A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 远人 中级黑马   /  2014-3-26 10:39  /  1663 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 远人 于 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,那为什么这里运行会失败?

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

8 个回复

倒序浏览
一开始的编译,电脑只会对你写的语法进行检查,第二部进行链接时就会报错,不然,你要是在程序里写了无数个错误,上边弄个break。程序还能运行。
回复 使用道具 举报
本帖最后由 程浩 于 2014-3-26 13:03 编辑

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

所以最好还是找一男一女的厕所

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1 很给力!

查看全部评分

回复 使用道具 举报
agelessman 发表于 2014-3-26 10:46
一开始的编译,电脑只会对你写的语法进行检查,第二部进行链接时就会报错,不然,你要是在程序里写了无数个 ...

链接出错?
能详细解释下不?
回复 使用道具 举报
远人 发表于 2014-3-26 14:56
链接出错?
能详细解释下不?

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

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

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

switch是接受整数的,所以在switch中’A‘==65
switch中不能有两个相同case的条件
回复 使用道具 举报
你编译的时候,编译器会首先检查语法,语法错了,程序运行不了自然会报错
回复 使用道具 举报
这段程序在编译的时候就已经出错了,还没到链接那步就不行了。
虽然在编译的时候预处理没有问题,都能通过,但是在编译的最后一步汇编时出错了。
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值有重复 并告诉你出错行数了
链接是链接系统库或是函数库,因为编译就有错误如果直接这样链接库也是一样直接报错。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马