switch 语句

fuzzy_man 2009-04-21 02:56:47
int i=4,j=0;
switch(i)
{
{ j=5;printf("test =%d",j);} // ...........(1) case 0:
j=0;
break;
case 1:
j=1;
break;
case 2:
j=2;
break;
case 3:
j=3;
break;
case 4: //.....................(2) j=4;
break;
case 5:
// j=1;
break;

default:
break;
}
printf("test =%d",j);


如上面的代码, 编译的时候语句(1)是肯定不会编译成汇编语句的,但是为什么还是会进行语法检查?
vc6.0上编译的时候所有的case 语句都会被编译,但是在armads120的环境中编译的时候,居然只编译了case 4: 其他的都被优化了,这种优化太神奇了,望高手解释一下!
...全文
295 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2009-04-22
  • 打赏
  • 举报
回复
编译是编译,优化是优化。
所以编译的时候一定会检查语法的,只要不是注释,都得通过语法,不管你会不会执行它。
而至于优化,就看你的编译器优化到什么程度了,比如LZ的那个什么armads120,能优化到那种“不可思议”的程度而已。
gql1123 2009-04-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 magipan 的回复:]
i的值是确定的,把用不到的分支给优化掉了吧
[/Quote]
ok
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 blh 的回复:]
引用楼主 fuzzy_man 的帖子:

int i=4,j=0;
switch(i)
{
{  j=5;printf("test =%d",j);}    //...........(1)case 0:
j=0;
break;
case 1:
j=1;
break;
case 2:
j=2;
break;
case 3:
j=3;
break;
case 4://.....................(2)j=4;
break;
case 5:
// j=1;
break;

default:
break;
}
printf("test =%d",j);


如上面的代码, 编译的时候语句(1)是肯定不会编译成汇编语句的,但是为什么还是会进…
[/Quote]

有道理

Proteas 2009-04-22
  • 打赏
  • 举报
回复
难道是传说中的 “学院派”。。。。。。
胡椒爸爸 2009-04-22
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 ForestDB 的回复:]
编译是编译,优化是优化。
所以编译的时候一定会检查语法的,只要不是注释,都得通过语法,不管你会不会执行它。
而至于优化,就看你的编译器优化到什么程度了,比如LZ的那个什么armads120,能优化到那种“不可思议”的程度而已。
[/Quote]

up

一个正常的编译过程对于每一条语句都要做检查的,即是没有用到,毕竟优化是各自编译器的实现,语法检查和词法检查不能因为后面有优化就忽略某些部分。
yingkundu 2009-04-22
  • 打赏
  • 举报
回复
这样的代码那出来讨论有什么用呢?来点有实际意义的。
xiaoshun123 2009-04-22
  • 打赏
  • 举报
回复
代码写的的确有点乱。。。
东莞某某某 2009-04-21
  • 打赏
  • 举报
回复
楼上正解
blh 2009-04-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 fuzzy_man 的帖子:]
int i=4,j=0;
switch(i)
{
{  j=5;printf("test =%d",j);}    //...........(1)case 0:
j=0;
break;
case 1:
j=1;
break;
case 2:
j=2;
break;
case 3:
j=3;
break;
case 4://.....................(2)j=4;
break;
case 5:
// j=1;
break;

default:
break;
}
printf("test =%d",j);


如上面的代码, 编译的时候语句(1)是肯定不会编译成汇编语句的,但是为什么还是会进行语法检查?
vc6.0上编译…
[/Quote]

因为你的程序中i并不是一个不确定值,而是一个已经明确的值,所以只有case 4这条有意义,其他都是无用的


int i=4,j=0;

for (i = 0; i <=7; i++)
{
switch(i)
{
{ j=5;printf("test =%d",j);} //...........(1)case 0:
j=0;
break;
case 1:
j=1;
break;
case 2:
j=2;
break;
case 3:
j=3;
break;
case 4://.....................(2)j=4;
break;
case 5:
// j=1;
break;

default:
break;
}
printf("test =%d",j);
}

这样就不会优化掉了

zgjxwl 2009-04-21
  • 打赏
  • 举报
回复
怎么可能不进行编译呢。。
老六 2009-04-21
  • 打赏
  • 举报
回复
为什么声明并初始化了变量
还要用switch语句
直接给j赋值不就行了么
即使要用switch语句
但是在switch语句前面加句
从键盘输入i的值
printf("输入i的值:");
scanf("%d",&i);
这样应该可以达到要求
#include"stdio.h"
void main()
{
int i=4,j=0;
printf("ÊäÈëiµÄÖµ£º");
scanf("%d",&i);
switch(i)
{
case 0:
{j=5;printf("test =%d\n",j);}
j=0;
break;
case 1:
j=1;
break;
case 2:
j=2;
break;
case 3:
j=3;
break;
case 4:
j=4;
break;
case 5:
j=1;
break;

default:
break;
}
printf("test =%d\n",j);
}
china_west 2009-04-21
  • 打赏
  • 举报
回复
谦虚学习
polaris_chow 2009-04-21
  • 打赏
  • 举报
回复
同意楼上的看法
magipan 2009-04-21
  • 打赏
  • 举报
回复
i的值是确定的,把用不到的分支给优化掉了吧
蒙面黑衣人 2009-04-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yingkundu 的回复:]
语法检查是预处理时候做的事情,只要运行时候不编译成汇编就行了,switch只匹配case。
[/Quote]
学习了,虽然以前没这么用过,已后也不会这样写。
yingkundu 2009-04-21
  • 打赏
  • 举报
回复
语法检查是预处理时候做的事情,只要运行时候不编译成汇编就行了,switch只匹配case。
alexhilton 2009-04-21
  • 打赏
  • 举报
回复
这是什么呀!好乱啊!
fuzzy_man 2009-04-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hairetz 的回复:]
楼主,声明变量别放到swicth里,可以不.
从来都不建议这么做的.
[/Quote]

我承认我的问题有点钻牛角尖,正常写swicth没有这样写的。 我也没在里面声明变量,你的回答和问题貌似无关。。。
  • 打赏
  • 举报
回复
楼主,声明变量别放到swicth里,可以不.
从来都不建议这么做的.

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧