分支与循环
一. if语句
1. if
语法形式如下:
if (表达式)
语句
表达式成立在(为真),则语句执行,若表达式不成立(为假),则语句不执行
在c语言中,0为假,非0为真
例子:输入一个整数,判断是否为基数
int main()
{
int a=0;
scanf("%d",&a);
if(a%2==1) //这里的==的意思是判断相等,而一个=的意思是赋值
printf("是基数");
return 0
}
2. else
语法形式如下:
if (表达式)
语句
else
语句
就拿上面的那个例子继续举例,如果此时需要输入一个整数,判断是否为基数,并且打印是基数或是偶数
int main()
{
int a=0;
scanf("%d",&a);
if(a%2==1) //这里的==的意思是判断相等,而一个=的意思是赋值
printf("是基数");
else
printf("是偶数");
return 0
}
这时加上这一句else就可以打印出与if相反的结果,因此这两个结合叫做if…else语句
注意:如果编译器在else处报错,则极大的可能性是你的if语句后面加了分号
3.分支中包含多种语句
其实本质规则就是一个if或else不能打印两句,如果想打印两句,则需要把几句用大括号扣住
例子
int main()
{
int age=0;
scanf("%d",&age);
if (age>=18)
{
printf("成年了\n");
printf("可以谈恋爱了\n");
}
else
{
printf("未成年\n");
printf("不可以早恋哦\n");
}
return 0;
}
就像这个例子中printf(“成年了”); printf(“可以谈恋爱了”);这两句本身是不可以同时出现在一个if或else中,但是把他俩用大括号括起来,即可符合语法规定,正常运行
4. 嵌套if
if else 语句中,else可以与另一个if语句连用,构成多重判断
例子:输入一个整数,判断输入的是0,还是正数,还是负数
第一种写法:else里嵌套if
int main()
{
int a=0;
scanf("%d",&a);
if(a==0)
printf("输入的数字是0\n");
else
{
if (a>0)
printf("输入的数字是正数");
else
printf("输入的数字是负数");
}
return 0;
}
第二种写法:if里嵌套else
int main()
{
int a=0;
scanf("%d",&a);
if (a>=0)
{
if(a==0)
printf("输入的数字是0");
else
printf("输入的数字是正数");
}
else
printf("输入的数字是负数");
return 0;
}
第三种写法(推荐):else if语句,本质就是第一个if结束,但是如果直接使用else再使用嵌套,则太麻烦而且字数太多,使用else if(表达式)语句,可以使代码看起来更方便理解和美观
int main()
{
int a=0
scanf("%d",&a);
if (a==0);
printf("输出的数字是0");
else if(a>=0)
printf("输出的数字是正数");
else
printf("输出的数字是负数");
return 0;
}
5. 悬空else问题
如果有多个if和else,可以记住这一条规则,else总是跟最近的if匹配
例子:
int main()
{
int a=0;
int b=0;
if(a==1)
if(b==2)
printf("你好");
else
paintf("我不好");
return 0;
}
这是肯定会有人认为,代码会先判断a是否等于1,如果不等于1,那么会输出我不好
这种想法是错误的,因为else总是跟最近的if匹配,同时上面代码的else放错了位置,这样会造成读者的误解,因此为了让代码可以清楚的别理解,我们可以这样写:
int main()
{
int a=0;
int b=0;
if(a==1)
{
if(b==2)
printf("你好");
else
printf("我不好");
}
return 0;
}
二. 关系操作符
C语⾔⽤于⽐较的表达式,称为“关系表达式”(relational expression),⾥⾯使⽤的运算符就称
为“关系运算符”(relational operator),主要有下⾯6个
⼤于运算符
< ⼩于运算符
= ⼤于等于运算符
<= ⼩于等于运算符
== 相等运算符
!= 不相等运算符
注意1:相等运算符(==)与赋值运算符(=)是两个不一样的运算符,本质就是:==是判断相等,而一个=的意思是赋值
注意2: 多个关系运算符不可以连用。例如 i<j<k 这个式子在写代码时不可出现,正确的表达应该是i<j && j<k,这里解释一下&&的意思是“并且”
三. 条件操作符
定义:条件操作符也叫三目操作符,形式如下
exp1 ? exp2 : exp3
条件操作符的计算逻辑是:如果exp1为真,则exp2计算,计算结果为整个式子的结果;如果exp1为假,则exp3计算,计算的结果则为整个式子的结果
例子:如果输入一个数字,它大于5则输出数字3,如果它小于或等于5,则输出数字-3
int main()
{
int a=0;
int b=0;
scanf("%d",&a);
b=a>5 ? 3 : -3;
printf("%d",b);
return 0;
}
四. 逻辑操作符
逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式,主要有下⾯三个运算符
! :逻辑取反运算符(改变单个表达式的真假)
&& :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)
|| :或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)
注:C语⾔中,⾮0表⽰真,0表⽰假
1.逻辑取反运算符 !
a | b |
---|---|
非0 | 0 |
0 | 1 |
2.逻辑取与操作符 &&
a | b | a&&b |
---|---|---|
非0 | 非0 | 非0 |
非0 | 0 | 0 |
0 | 非0 | 0 |
0 | 0 | 0 |
&&操作符的·意思是并且,使用方法是a&&b,&&两边的表达式如果都为真,则整个表达式都是真,如果有一边是假,则整个表达式都为假
例子:
int main()
{
int mounth=0;
scanf("%d",&month);
if(mounth>=3 && month <=5)
printf("春季");
return 0:
}
这里的意思就很明显了,month既要大于等于3,又要小于等于5
3.逻辑或操作符 ||
|| 的意思是或者,|| 也是一个双目操作符,使用方法 a||b , ||两边只有有一个真,则整个表达式都为真
例子:用代码体现一年中是12月·或者1月或者2月是冬天
int mian()
{
int month=0;
scanf(%d,&month);
if (month==0||month==1||month==2)
printf("冬季\n");
}
4.练习:闰年的判断
输入一个年,判断是否是闰年
闰年判断规则:1. 能被4整除且不能被100整除的是闰年 2. 能被400整除是闰年
int mian()
{
int year=0;
scanf("%d",&year);
if((year%4==0 && year%100!=0)||(year%400==0))
printf("是闰年");
return 0;
}
一开始当我看到这个题时我写的是
if(year%4==0 && year%100!=0)
printf("闰年");
else if (year%400==0)
printf("闰年");
这种写法是错误的,因为if else 是分支语句,因此代码只能进行到两者之一,因为if在前,所以进入if就不会出来了,因此else if就失效了。如果想让year%400==0有效,则改为:
if(year%4==0 && year%100!=0)
printf("闰年");
if (year%400==0)
printf("闰年");
此处删掉else,改为双if,则可忽略二选一的问题
五. switch语句
除了if语句,c语言还提供了switch语句来实现分支结构
switch语句是一种特殊的if…else结构,用于判断条件有多个结构的情况。他把多重的else if改成更易用,更可读的形式
语法形式
switch(expression)
{
case 1: statement
case 2: statement
default: statement
}
在上面的代码中,根据表达式expression不同的值,执行相应的case分支。如果找不到对应的值,就执行default分支
注意:
switch后的expression必须是整型表达式
case后的值,必须是整型常量表达式
1. if 语句与switch语句的对比
例子:输入一个整数值,计算除与3之后的余数
使用if
int main()
{
int a=0;
scanf("%d",&a);
if (a%3==1)
printf("余数是1\n");
else if (a%3==2)
printf("余数是2\n");
else
printf("余数是0\n");
return 0;
}
使用switch
int main()
{
int a=0;
scanf("%d",&a);
switch (a%3)
{
case 0:
printf("余数是0");
break;
case 1:
printf("余数是1");
break;
case 2:
printf("余数是2");
break;
}
return 0;
}
其实switch语句常用在一个表达式求值,如果遇到范围之类的,还是需要使用if语句
在switch语句中还要注意:
**1. case和后面的数字之间必须要有空格 **
2. 每一个case 语句的代码执行完,都要在后面加上break,这样才能跳出这个循环
2. switch里的default
default其实就是定义一个默认输出结果,如果所有的case都不满足,则会自动进入默认值default里进行打印
例子:打印星期,如果day的输入不是1-7的值,则输出“输入错误
int main()
{
int day=0;
scanf("%d",&day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日");
break;
case 6:
case 7:
printf("休息日");
break;
default:
printf("输入错误");
break;
}
return 0;
}
注意:case语句与default语句是没有先后顺序的,不过为了方便理解,一般都会把default放在最后面
六. while循环
1.if和while的对比
语法结构与if的很相似
while(表达式)
语句;
下面进行代码的对比:
1.if
int main ()
{
if (1)
printf("hehe\n");
return 0;
}
这个代码的意思是:如果if后面的条件满足,结果只打印一次hehe
2.while
int main()
{
while (1)
printf("hehe");
return 0;
}
这个代码会进入死循环,一直打印hehe
2. while循环的实践
例子:在屏幕上打印1-10的值
int main()
{
int a=1;//循环变量的初始化
while (a<=10)//括号里的内容其实是在判断,如果只是一个数字,则判断它是否为0,因为为0则为假
{
printf("%d",a);
a=a+1;//调整
}
return 0;
}
练习:输入一个整数,逆序打印这个整数的每一位
int main()
{
int a=0;
sacnf("%d",&a);
while(a)
{
printf("%d",a%10);//获取输入数的最小值
a=a/10;//去掉输入数的最低位
}
return 0;
}
此处的a如果运行到0时,则自动停止,因为0在c语言中表示假
七. for循环
1.语法形式
for 循环其实是三种循环里用的最多的,语法形式如下:
for(表达式1; 表达式2; 表达式3)
语句;
表达式1:用于循环变量的初始化(初始化的数字是先直接进行语句的运行,不需要先被调整)
表达式2:用于循环变量结束条件的判断
表达式3:用于循环变量的调整
2. for循环的实践
例子:在屏幕上打印1-10的所有值
int main()
{
int a=0;
for(a=1; a<=10; a++)
printf("%d",a);
return 0;
}
练习:计算1-100之间3的倍数的数字之和
int main()
{
int a=0;
int sum=0;
scanf("%d",&a);
for (a=1; a<=100; a++)
{
if (a%3==0)
sum+=1;
}
printf("数字之和是",sum);
return 0;
}
八. do-while循环
1.语法结构
do-while语句是三大循环结构中最少用的,语法形式如下:
do
语句;
while(表达式);
表达式的作用是判断
do while 语句与for和while最大的区别是:前者是先执行,后判断。而后两者是先判断,后执行循环语句
2. do while循环的实例
例子:在屏幕上打印1-10的值
int main()
{
int a=1;
do
{
printf("%d",a)
i=i+1
}while(i<=10)
return 0;
}
练习:输入一个正整数,计算这个整数是几位数
int main()
{
int a=0;
int b=0;
scanf("%d",&a);
do
{
b=b+1;
a=a/10;
}while (a)
printf("%d\n",b);
return 0;
}
在这段代码中,b就相当于统计循环了多少次,同时在此题中,循环的次数代表着输入的整数是几位数
九. break和continue语句
break的作用是永久的终止循环,只要有break出现,就会立即跳出循环
continue的作用是跳过本次循环continue后面的代码
十. goto语句
goto语句可以实现在同一个函数内跳转到设置好的标点符号处
例子:
int main()
{
printf("hehe\n");
goto next;
printf("haha\n");
next:
printf("hihi\n");
return 0;
}
这串代码的意思就是跳过了haha,只打印hehe和hihi
另外goto语句可以从多个循环中直接跳出,这也是它的一个有点,例
for(...)
{
for(...)
{
for(....)
{
语句
goto next;
}
}
}
next:
在这里使用goto·语句可以是程序直接跳出多个循环,然而break却不能,因为它只能跳出一层for循环。