c语言switch语句

有以下程序
int x=1,y=0,a=0,b=0;
switch (x)
{case 1:
switch(y)
{
case 0:a++;break;
case 1:b++;break;
}
case 2: a++,b++;break;
case 3:a++,b++;
}
printf("a=%d,b=%d\n",a,b)
运行结果为a=2,b=1
请注意我打问号的地方!!!!
请注意看以下解析:
首先进入第一个switch(x)语句判断,进入case1中进行嵌套判断switch(y)也成立a自加1,遇到break,退出嵌套,接着执行case2,a自加为2,b自加为1,遇到break结束此循环,此时a=2,b=1

a的自加是先执行后在自加,当此程序a自加的时候没有执行其他语句啊??????

另外!!!!!!
我的课本上说:计算switch后括号内表达式的值然后用该值逐个与case后的常量表达式进行比较,当找到匹配的值时就执行该case后面的语句。所有case中没有匹配的就执行default后面的语句

但是实际操作和上面的解析中并没有像书上所说的执行啊,执行完第一个后a的值为1 为什么有执行case 2了呢???????????a的值又不等于2
在执行case的时候是不是要判断case后面的值啊,怎么判断?????????

执行case 2是因为在switch (x) 中x=1,所以执行case 1,然而case 1 这条语句没有break,所以switch (x)在执行了case 1之后将继续往下依次执行case语句,直到碰到break就跳出switch 循环。

对于“a的自加是先执行后在自加,当此程序a自加的时候没有执行其他语句啊?????? ” 则是你没看到程序中的语句a++,b++它自加完了以后把值任然是赋值给a,b本身的,而不是赋值给其他变量例如c=a++;z=b++。如果是这样赋值给别的变量的话那么就很明确了c,z的值将和课本上说得一样都是自加以前的值 。也就是说这个程序当中最后printf输出的是a,b的值,但是a,b在自加过程中值都变化了,就是说相当于语句a=a++,b=b++.
我将你的程序进行了更改,你将两个程序都运行下然后再对照着看一下就明白为什么a,b的值最后是2和1了,程序如下
#include <stdio.h>
main()
{
int x=1,y=0,a=0,b=0,c=0,z=0;
switch (x)
{case 1:
switch(y)
{
case 0:c=a++;break;
case 1:b++;break;
}
case 2: c=a++,z=b++;break;
case 3:a++,b++;
}
printf("c=%d,z=%d\n",c,z) ;
}

对于 ++i 和i++ 有什么区别?
简单而言: ++i在i 存储的值上增加一并向使用它的表达式“返回” 新的, 增加后的值; 而i++ 对i增加一, 但返回原来的是未增加的值。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-09-10
特意找课本看了一下:

switch(表达式)
{
case常量表达式1: 语句1;
case常量表达式2: 语句2;

case常量表达式n: 语句n;
default : 语句n+1;
}

其语义是:计算表达式的值。 并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时, 即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。 如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。

在switch语句中,“case 常量表达式”只相当于一个语句标号, 表达式的值和某标号相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出整个switch 语句,所以出现了继续执行所有后面case语句的情况。 这是与前面介绍的if语句完全不同的,应特别注意。为了避免上述情况, C语言还提供了一种break语句,专用于跳出switch语句,break 语句只有关键字break,没有参数。在后面还将详细介绍。修改例题的程序,在每一case语句之后增加break 语句, 使每一次执行之后均可跳出switch语句,从而避免输出不应有的结果。
第2个回答  推荐于2017-09-18

C语言中,switch语句的使用格式如下:

switch(表达式)

{

    case 常量表达式1 : 语句1; break;

    case 常量表达式2 : 语句2; break;

    ......

    case 常量表达式n : 语句n; break;

    default : 语句n+1;

}


举例如下:

int i=4, a=0;
switch(i)
{
    case 1 : a++; break;  // 如果i=1,执行case 1 后面的语句,执行完后退出switch
    case 2 : a+=2; break; // 如果i=2,执行case 2 后面的语句,执行完后退出switch
    case 4 : a+=4; break; // 如果i=4,执行case 4 后面的语句,执行完后退出switch
    default : a=0;  // 如果i不等于上面所以case中的值,执行default后面的语句,执行完后退出switch
}

第3个回答  2019-07-07
楼主好,楼上的哥们好!
楼上的两位哥们都是直接把x当整型处理的,楼主并没有说x是整型啊,对不对?
这是我的程序:
#include
<stdio.h>
main()
{
double
x,y;
int
a;
scanf("%lf",&x);
a=(int)x;
/*将x的值强制转换为整形,也就是截去小数点后面的,赋给a*/
switch(a)
{
case
-4:y=x-1;break;
case
-3:y=x-1;break;
case
-2:y=x-1;break;
case
-1:y=x-1;break;
/*********************
其实上面这一段可以写成这样
case
-4:
case
-3:
case
-2:
case
-1:
y=x-1;break;
简化程序
下边这段也同理....
***********************/
case
7:y=x+1;break;
case
6:y=x+1;break;
case
5:y=x+1;break;
case
4:y=x+1;break;
case
3:y=x+1;break;
case
2:y=x+1;break;
case
1:y=x+1;break;
case
0:y=x;break;
default:printf("Input
Error\n");goto
loop;
}
printf("x=%lf\ny=%lf\n",x,y);
loop:;
getch();
}
这样不管你输入是整数还是浮点数都行啦....
其实一楼的哥们的方法超好啊。如果把int
x,y改成double
x,y就完美了..(这好像不是个问题.....)
程序我测试过了,没发现问题。(饿只是说饿没有发现问题,谁发现的问题快点指正!!!)
====================================
lipbb说的很对,上面我写的程序确实有错误....懒得改了.....这是我想的另一个方法:
用switch嵌套,饿测试过了,没发现问题。(饿只是说饿没有发现问题,谁发现的问题快点指正!!!)
#include
<stdio.h>
main()
{
double
x,y;
printf("please
input
x\n");
scanf("%lf",&x);
switch(-5<x&&x<0)
{
case
1:y=x-1;break;
case
0:
{
switch(x==0)
{
case
1:y=x;break;
case
0:
{
switch(0<x&&x<8)
{
case
1:y=x+1;break;
case
0:printf("Input
Error\n");goto
loop;
}
}break;
}
}break;
}
printf("x=%lf\ny=%lf",x,y);
loop:;
getch();
}
楼主有不明白的地方可以给我留言。
第4个回答  2008-09-10
先回答你第一个问题
首先 如果只有一条语句的话, a++; 和 ++a; 效果是一样的,都是a自加1
因为没别的语句, 先执行后自加和先自加后执行效果是一样的, 只有有别的
语句的时候效果才不一样,比如 x = a++ ;与 x= ++a; 就不一样了。
第二个问题
case 语句是一个入口, 只要匹配进入了入口, 就会执行后面的所有语句
而不会再去判断 后面的case,只有碰到了break才会跳出循环,比如说
你上面如果case2 后面没有break的话, 他还会执行case3, 反正是从
匹配的值的位置开始, 执行下面所有的语句而不再判断
相似回答