选择语句
if语句
1.if(表达式){语句;}
单分支结构
表达式:
用于判断是否执行语句,0为假,非0值为真;为真即执行。例如:if(0)和if(1),if(1)执行
执行逻辑:
当if表达式中为真,则执行下面的语句,为假则不执行
示例:
int main()
{
int age = 0;
scanf("%d",&age);
if(age>18) //当输入的值大于18即判定为真,执行下面语句
printf("成年\n"); //语句
return 0;
}
并列情况
当出现交叉关系,可并列使用if
示例:求闰年
int main()
{
int temp1 = 0;
scanf("%d",&temp1);
if(temp1%4 == 0 && temp1%100 != 0) //对可以对4整除,对100不整除
printf("是闰年\n"); //语句
if(temp1%400 == 0) //对400取余不为0即 被整除
printf("是闰年\n"); //语句
return 0;
}
如上述示例,当出现多种情况需要判断,就可使if并列使用
2.if(表达式){语句1;}else{语句2;}
双分支结构
执行逻辑:
当表达式为真时,执行语句1,否则(表达式为假)执行语句2
示例:
int main()
{
int age = 0;
scanf("%d",&age);
if(age>=18) //表达式
printf("成年\n"); //表达式为真则执行语句1
else
printf("未成年\n"); //表达式为假执行语句2
return 0;
}
虽然是双分支结构,但只执行一次
3.if(表达式1){语句1;}…else if(表达式n){语句n;}else{语句n+1;}
用于多分支结构
执行逻辑:
当表达式1为真时,执行语句1;若表达式1为假时,则表达式2为真时,执行语句2以此类推;直到其中一个表达式为真时,执行该表达式下的语句。
示例:
int main()
{
int age = 0;
scanf("%d",&age);
if(age<18)
printf("青少年\n");
else if(age>=18 && age<30)
//不可以(18<=age<30)这种型式写,按照操作符的顺序,假设给10,10小于age为假(0),0<30为真,但10岁不满足此分类要求
printf("青年\n");
else if(age>=30 && age<50)
printf("中年\n");
else if(age>=50 && age<80)
printf("中老年\n");
else if(age>=80 && age<100)
printf("老年\n");
else
printf("老寿星\n");
return 0;
}
注意:
1.虽然上述示例判断条件多,但也是只执行1次,只有并列if时才是每个都执行。
2.无论是上述哪种情况,当表达式下的语句不止一条时,应加上 { } 。
4.常见误区
1.
int main()
{
int a = 0;
int b = 2;
if(a ==1)
if(b==2)
printf("hehe\n");
else //容易误解的地方
printf("haha\n");
return 0;
}
上述示例执行结果为:不输出,因为else在没有加 { } 的时候只会与最近的if相结合,所以应该书写规范与if(b == 2)对齐。
若想让if(a == 1)相结合,需要用 { 把if( b== 2)和他的语句 } 括起来,因为此时if(a == 1)的执行语句变为两条。
如:
if(a == 1)
{
if(b==2)
printf("hehe\n");
}
else
printf("haha\n");
int add()
{
int a = 1;
int b = 2;
if(a==2)
return 0;
return 1; //应此处加上else,否则容易误解
}
int main()
{
int x = add();
printf("%d\n",x); //输出结果为1
return 0;
}
return的作用一是返回值,二是结束该函数,上述代码容易让人误解,实际应在return1加上else。
3.
int main()
{
int a = 1;
if(a=5) //应改为 a==5
printf("hehe\n");
// if(5==a) //当出现赋值符号的判断时,可以把变量写在左边
// printf("hehe\n"); //这样在编译时,如果漏丢 '=' 会提示报错
return 0;
}
应该是a==5,但a=5也输出了hehe,实际操作中类似情况容易出现错误
在表达式中如果存在赋值符号,可以把数放左边。
以上几种情况均属于书写风格的问题,所以在平时练习时要多多注意规范编写,避免以后的编写出现不必要的障碍。
switch语句
当出现多分支场景时,多次使用if(){ } else if(){ }可能会繁琐,此时可以使用switch语句
switch语句的基本格式:
switch(表达式)
{
case 常量1:
要执行的语句;
case 常量2:
要执行的语句;
case 常量3:
要执行的语句;
case 常量4:
要执行的语句;
}
和if一样若是语句大于1需要加 { }
注意,表达式中可以是变量、常量,但必须是整型数据类型
执行逻辑:
当表达式中的整数或变量与 case 前的常量相同时,执行该case下的语句;但是,执行完该语句还会执行后续case的语句。
此时应在每个执行语句后面加上 break 如:
加break
switch(表达式)
{
case 常量1:
要执行的语句;
break;
case 常量2:
要执行的语句;
break;
case 常量3:
要执行的语句;
break;
case 常量4:
要执行的语句;
break;
}
这时表达式与case匹配时,执行该case下的语句后不会再继续执行后面case的语句了。
若,表达式与case 中的常量没有相匹配时,应再加上 default 如:
加default
switch(表达式)
{
case 常量1:
要执行的语句;
break;
case 常量2:
要执行的语句;
break;
case 常量3:
要执行的语句;
break;
case 常量4:
要执行的语句;
break;
default:
case没有的情况时要执行的语句;
}
default可以加在开头也可以加在末尾,但在开头时要加上 break 防止影响后续的代码。
示例1:每个case都加break的情况
int main()
{
int day = 0;
scanf("%d",&day);
switch(day)
{
case 1:
printf("周一\n");
break;
case 2:
printf("周二\n");
break;
case 3:
printf("周三\n");
break;
case 4:
printf("周四\n");
break;
case 5:
printf("周五\n");
break;
case 6:
printf("周六\n");
break; //若不添加break 则会继续执行剩余case的语句,
case 7:
printf("周日\n");
break; //braek的作用是 停止/跳出
default: //default的作用是case不包含的情况
printf("输入错误\n");
}
return 0;
}
示例2:个别case后加break的情况
int main()
{
int day = 0;
scanf("%d",&day);
switch(day)
{
default:
printf("输入错误\n");
break; //default在开头要加上break
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
}
return 0;
}
循环语句
while循环语句
基本格式:
while(表达式)
{
要执行的语句
}
和if一样若是语句大于1需要加 { }
while表达式与if表达式大致相同,所以执行逻辑为,表达式为真,则执行语句,为假则不执行;当从真变为假时,先继续执行到最后一条语句与表达式比较后判定为假,则跳出循环
示例1:打印数字1——10
int main()
{
int i = 1;
while(i<=10)
{
printf("%d\n",i);
i++;
}
return 0;
break在while中的现象
示例2:
int main()
{
while(i<=10)
{
if(5==i)
break;
printf("%d\n",i);//输出结果是 1 2 3 4
i++;
}
return 0;
}
该程序说明 break 在while中是永久停止/跳出该循环的
continue在while中的现象
示例3:
int main()
{
int i = 1;
while(i<=10)
{
if(5==i)
continue; //直接跳到判断表达式位置即将(i<=10)位置处
printf("%d\n",i); //输出结果是 1 2 3 4—死循环
i++;
}
return 0;
}
continue的作用是忽略后面程序,直接跳到判断表达式位置
上述输出结果出现死循环,因为i加到5时会跳到判断表达式,之后继续执行if,接着再跳到判断表达式直至———死循环
while处理scanf留下的换行符
在使用scanf时,先是从键盘向键盘缓冲区输入,之后按回车时,输入的数据被送入到程序由变量接受,但会再键盘缓冲区留下一个换行符,若是下次想输入输出字符或字符串时,会受影响
这时可以使用while+putchar来处理
int main()
{
//while((ch = getchar()) != EOF) //输入错误或读取到末尾会返回EOF (EOF=-1)
//putchar(ch); //按ctrl+z会让getchar返回EOF
//最好用int 接收putchar等函数的返回值,因为char型太小最大范围是128,存在超出范围的风险
//上述循环体的作用是,打印每次输入的字符或者字符串,ctrl+z停止
int password[20] = {0};
int ch = 0;
int temp = 0;
printf("请输入密码:");
scanf("%s",password); //在输入密码时 如123456但是按下回车时,会在键盘缓冲器留下一个'\n',处理不好会令后续读取字符时读取到换行符
//方法一
//getchar(); //getchar会先在缓冲区读取字符
//方法二
while((temp = getchar()) != '\n'); //或者直至等待该次输入完成后读取到换行符时跳出循环
printf("请确认密码(Y/N):\n");
ch = getchar();
if('Y'== ch)
printf("确认成功\n");
else
printf("确认失败\n");
return 0;
}
可以如上所示使用while避免\n被错误读取
for循环语句
基本格式:
for(表达式1;表达式2,表达式3)
{
语句;
}
和if一样若是语句大于1需要加 { }
执行逻辑:
先执行表达式1,再判断行表达式2是否为真,若为真则执行语句,之后执行表达式3,再与表达式2判断,直至为假跳出循环
示例1:打印1——10
int main()
{
int i = 0;
for(i=1;i<=10;i++)
printf("%d\n",i);
return 0;
}
//令i=1,再判断是否小于等于10,为真执行打印函数,之后令i自增在于10进行判断直至大于10(为假)退出循环
break在for中现象
示例2:
int main()
{
int i = 0;
for(i = 1;i <= 10; i++)
{
if(5==i)
break; //break会终止/跳出循环
printf("%d\n",i); //输出结果:1234
}
return 0;
}
break会 跳出\退出 循环,最后输出结果到4截至
continue在for中的现象
示例3:
int main()
{
int i = 0;
for(i = 1;i <= 10; i++)
{
if(5==i)
continue; //continue会直接跳到表达式最右端,即 i++位置
printf("%d\n",i); //输出结果 1 2 3 4 6 7 8 9 10
}
return 0;
}
continue会跳到for循环最右侧表达式3,最后输出结果没有5
for的一些变种示例
1.没有任何表达式
for(;;)
printf("hh\n"); //会一直输出
等同于while(1)是个死循环
2.相乘形式
for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
printf("hh\n"); //hh打印了100次
}
相当于 10乘10
注意: 在最里层添加break,只会对最里层的break管用
3.取消赋予初始值
for(; i<10; i++)
{
for(; j<10; j++)
printf("hh\n"); //hh打印了10次,因为第一个i的十次结束后,j并没有赋予初始值
}
只会打印十次,因为当110退出时,j=11,再次进入时是从11开始 即111
除了以上三种,还可在for中使用多个变量,函数等
do—while循环语句
基本格式:
do
{
语句;
}while(表达式); //注意符号 ;
执行逻辑:
先执行一遍语句,在对表达式进行判断,为真则继续执行,为假则退出
所以do—while使用的时候很少,适用于必须先执行一次的情况
示例1:打印1——10
int main()
{
int i = 1;
do
{
printf("%d\n",i); //先执行
i++;
}while(i<=10); //后判断
return 0;
}
break在do—while中的现象
示例2:
int main()
{
int i;
do
{
printf("hh\n"); //打印 1-4
i++;
if(5==i)
break;
}while(i<=10);
return 0;
}
输出结果为打印至4截至
continue在do—while中的现象
示例3:
int main()
{
int i;
do
{
printf("hh\n"); //打印到4后开始死循环
i++;
if(5==i)
continue;
}while(i<=10);
return 0;
}
continue跳到表达式最后侧,while就一个表达式所以与while循环相同,导致死循环
总结
1.if多分支的时候不管有多少,只执行一次,并行if是每个都执行
2.对于 “==” 带赋值符号是可以考虑变量写左边
3.注意switch的break与default的细节
4.break会退出循环,且break只退出距离最近的循环
5.continue会跳到循环表达式的最右侧
6.对于大于一条语句时要加上 { }
7.注意书写格式的对齐