前言
C语言是结构化的语言,这里的结构化指的是:顺序结构、分支结构、循环结构。
如果你认真观察,可以发现在我们的日常生活中我们遇到的问题都是这三种结构的组合。
在C语言中用if、 switch来实现分支结构,用while、for、do…while来实现循环结构。
1. 操作符
1.1关系操作符
在C语言中我们用有6
个关系操作符,我们回顾一下在C语言中非0为真,0为假。
以下操作符为真时返回1
,为假时返回0
。
>
:用于判断一个值是否大于另一个值。<
:用于判断一个值是否小于另一个值。>=
:用于判断一个值是否大于或等于另一个值。<=
:用于判断一个值是否小于或等于另一个值。!=
:用于判断两个值是否不相等==
:用于判断两个值是否相等。
注意:在C语言中判断两个值是否相等用的是==
而不是赋值操作符=
。
a > b
a < b
a >= b
a <= b
a != b
a == b
1.2 条件操作符
exp1?exp2;exp3
:条件操作符(也称为三元操作符)是一种在一个表达式中使用条件语句的方法。
其中,exp1是一个条件表达式,exp2和 exp3是两个可能的结果表达式。如果 exp1 为真,则返回 exp2的值;否则返回 exp3 的值。
它可以替代简单的 if…else
语句,使代码更加简洁。
如使用if语句写:
#include <stdio.h>
int main()
{
int i = 5;
int j = 4;
if (i > j)
{
i = i + 1;
printf("%d\n", i);
}
else
{
i = i + 2;
printf("%d\n", i);
}
return 0;
}
使用条件操作符写:
#include <stdio.h>
int main()
{
int i = 5;
int j = 4;
if(i>j?i+1:i+2)
printf("%d",i);
return 0;
}
可以看到代码简洁了很多。
1.3 逻辑操作符
我们把操作符左右两边的表达式称为操作数,在C语言中非0表示真,0表示假。
C语言中有三种逻辑运算符分别是:与、或、非
&&
:当两边的操作数都为真时,整个表达式才为真。||
:两边的操作数只要有一个为真,整个表达式为真。!
:改变右边操作数的真值。
1.3.1 逻辑操作符的短路
C语⾔逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值。
如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。
if(month >= 3 && month <= 5)
表达式中&&
的左操作数是 month >= 3 ,右操作数是 month <= 5 ,当左操作数 month >= 3 的
结果是0
的时候,即使不判断 month <= 5 ,整个表达式的结果也是0
(不是春季)。
所以,对于&&
操作符来说,左边操作数的结果是0
的时候,右边操作数就不再执⾏。
对于||
操作符是怎么样呢?我们结合前⾯的代码:
if(month == 12 || month==1 || month == 2)
如果month == 12,则不⽤再判断month是否等于1
或者2
,整个表达式的结果也是1
(是冬季)。
所以,||
操作符的左操作数的结果不为0
时,就⽆需执⾏右操作数。
像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进⾏计算的运算称为短路求值。
2. if语句
if (表达式)
{
语句;
}
- 表达式:进入分支的判断条件。
- 语句:实现分支的代码。
#include <stdio.h>
int main()
{
int year = 0;
scanf("%d", &year);
if (year >= 18)
printf("成年人");
return 0;
}
注意:当if
语句后面只有一条语句时,可以不带{}
。
2.1 语法形式
2.2 else
else
的使用是和if
配套的,不可单独使用,它的意义是不满足if
表达式的情况,都会进入到else
里面并执行里面的代码。
#include <stdio.h>
int main()
{
int year = 0;
scanf("%d", &year);
if (year < 18)
printf("未成年\n");
else
printf("成年人\n");
printf("可以谈恋爱了\n");
return 0;
}
你会发现不管是输入 year>18
还是 year<18
,都会打印出可以谈恋爱了,这是因为当else
不带{}
时默认只会控制一条语句。所以当else
语句后面只有一条语句时,才可以不带{}
。
所以为了避免发生以上情况,在写代码时尽量带上{}
。
#include <stdio.h>
int main()
{
int year = 0;
scanf("%d", &year);
if (year < 18)
printf("未成年\n");
else
{
printf("成年人\n");
printf("可以谈恋爱了\n");
}
return 0;
}
2.3 if语句的嵌套
if…else
语句嵌套时可以构成多重判断。
例子1:输入一个数判断它奇数还是偶数,或者是负数。
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num == 0)
printf("%d是零", num);
else
{
if (num > 0)
{
if (num % 2 == 0)
printf("%d是偶数", num);
else
printf("%d是奇数", num);
}
else
printf("%d是负数");
}
return 0;
}
例子2:
输⼊⼀个⼈的年龄
如果年龄<18岁,打印"少年"
如果年龄在18岁⾄44岁打印"⻘年"
如果年龄在45岁⾄59岁打印"中⽼年"
如果年龄在60岁⾄89岁打印"⽼年"
如果90岁及以上打印"⽼寿星"
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("少年\n");
}
else
{
if (age <= 44)
{
printf("⻘年\n");
}
else
{
if (age <= 59)
{
printf("中⽼年\n");
}
else
{
if (age <= 89)
printf("⽼年\n");
else
printf("⽼寿星\n");
}
}
}
return 0;
}
以上代码也可以写成下面的形式:
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
printf("少年\n");
else if (age <= 44)
printf("⻘年\n");
else if (age <= 59)
printf("中⽼年\n");
else if (age <= 89)
printf("⽼年\n");
else
printf("⽼寿星\n");
return 0;
}
3. switch语句
3.1 语法形式
switch (表达式)
{
case 值1:
case 值2:
}
switch
的表达式必须为整形表达式。case
后面的值必须为整形常量。- 每一个
case
都是一个分支。
3.2 switch中break
break
意为打破,它的作用是跳出所在case
分支。
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一");
break;
case 2:
printf("星期二");
break;
case 3:
printf("星期三");
break;
case 4:
printf("星期四");
break;
case 5:
printf("星期五");
break;
case 6:
printf("星期六");
break;
case 7:
printf("星期天");
break;
}
return 0;
}
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一");
case 2:
printf("星期二");
case 3:
printf("星期三");
case 4:
printf("星期四");
case 5:
printf("星期五");
case 6:
printf("星期六");
case 7:
printf("星期天");
}
return 0;
}
可以看到如果在case
分支中不带break
,程序就会进入分支后继续执行下去,直到程序结束
3.4 default
default
意为默认,它的作用是不符合case
的值都会进入default
。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一");
break;
case 2:
printf("星期二");
break;
case 3:
printf("星期三");
break;
case 4:
printf("星期四");
break;
case 5:
printf("星期五");
break;
case 6:
printf("星期六");
break;
case 7:
printf("星期天");
break;
default:
printf("输入错误\n");
break;
}
return 0;
}
4. while循环
4.1 语法形式
while (表达式)
{
循环体;
}
- 表达式:这是循环的判断条件,满足才会进入循环。
- 循环体:你想要循环的代码。
注意,写循环一定要有限制条件,否则就会变成死循环,如:
#include <stdio.h>
int main()
{
int i = 0;
while (i)
{
printf("你好");
}
return 0;
}
限制条件包括两部分:
- 循环的判断条件
- 循环变量的调整部分
4.2 举例理解
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d", i);
i++;
}
return 0;
}
首先上来就是执行判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执行循环语句,语句执行完后再继续判断,是否进行下一次判断。
5. for循环
5.1 语法形式
- 表达式1:循环变量的初始化
- 表达式2:循环结束的判断条件
- 表达式3:循环变量的调整
- 循环体:你想要循环的代码
5.2 举例理解
#include <stdio.h>
int main()
{
int i = 1;
for (i = 1; i <= 10; ++i)
{
printf("%d", i);
printf("haha");
}
return 0;
}
首先执行 表达式1初始化循环变量,接下来就是执行表达式2的判断部分,表达式2的结果如果==0,则循环结束;表达式2的结果如果!=0则执行循环语句,循环语句执行完后,再去执行表达式3,调整循环变量,然后再去表达式2的地方执行判断,表达式2的结果是否为0,决定循环是否继续。
整个循环的过程中,表达式1初始化部分只被执行1次,剩下的就是表达式2、循环语句、表达式3在循环。
for循环和while循环在循环变量的调整方面有所不同,for循环的调整部分在循环体外;while循环的调整部分在循环体内。
6. do…while循环
6.1 语法形式
do
{
循环体;
} while (表达式);
- 循环体:你想要循环的代码
- 表达式:循环结束的判断条件
6.2 举例理解
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d", i);
i++;
} while (i <= 10);
return 0;
}
在do while循环中先执行循环语句,执行完语句,在去执行"判断表达式",判断表达式的结果是!=0,则继续循环,执行循环语句;判断表达式的结果==0,则循环结束。
所以在 do while语句中循环体是至少执行一次的,这是 do while 循环比较特殊的地方。
7. 循环中的break和continue
在写代码的过程中,我们往往不需要循环全部执行下去,当循环满足某种条件时,希望结束循环或跳过本次循环。
C语言提供了以下关键字可以帮助我们精细化控制循环。
break
:会结束所在循环,跳出所在循环。continue
:会跳过continue后面的代码,进行下一次循环。
7.1 while
7.1.1 break
#include <stdio.h>
int main()
{
int num = 1;
while (num <= 10)
{
if (num == 5)
break;
printf("%d ", num);
num++;
}
printf("\n");
return 0;
}
可以看到当num=5
时,循环就结束了。
7.1.2 continue
#include <stdio.h>
int main()
{
int num = 1;
while (num <= 10)
{
if (num >= 5)
continue;
printf("%d ", num);
num++;
}
printf("\n");
return 0;
}
以上代码会造成死循环,是因为每次num==5
时都会触发continue
,从而跳过本次循环后面的代码,但因num<=10
又会进入循环,如此来回往复。
所以想要跳过5
,打印1~10
的这样写代码:
#include <stdio.h>
int main()
{
int num = 1;
while (num <= 10)
{
if (num == 5)
{
num++;
continue;
}
printf("%d ", num);
num++;
}
printf("\n");
return 0;
}
7.2 for
7.2.1 break
#include <stdio.h>
int main()
{
int num = 1;
for (num = 1; num <= 10; ++num)
{
if (num == 5)
break;
printf("%d ", num);
}
printf("\n");
return 0;
}
当num==5
时,触发break
跳出循环。
7.2.3 continue
#include <stdio.h>
int main()
{
int num = 1;
for (num = 1; num <= 10; ++num)
{
if (num == 5)
continue;
printf("%d ", num);
}
printf("\n");
return 0;
}
在for
循环中不会出现上面while
遇到得情况,这是因为for
的循环变量调整部分并不是在循环体中。
7.3 do…while
do…while
循环中break
和continue
的用法和while
循环一样在此不再赘述。