C语言是结构化的程序设计语言,结构指的是顺序结构、选择(分支)结构、循环结构。
顺序结构顾名思义指的是程序按照代码的书写顺序,从上到下,从左到右依次执行。而选择结构、循环结构需要进行进一步深入了解,且听我娓娓道来。
1.常用操作符
1.1关系操作符
C语言中用来比较的表达式,叫做“关系表达式”,里面需要用到的运算符就称“关系运算符”,主要有以下6个。
>
大于运算符<
小于运算符>=
大于等于运算符<=
小于等于运算符==
相等运算符!=
不相等运算符
假设现有变量 a
和变量 b
, 拿相等运算符 ==
来说,有关系表达式 a == b
,其余5个也是同理,这里就不一一列举了。
关系表达式通常返回 0
和1
,表示真假。(C语言中,0
表示假,所有非零值表示真)
1.2 条件操作符
条件操作符又叫三目操作符,需要接受三个操作数,形式如下:
exp1 ? exp2 : exp3
条件操作符的计算逻辑是:如果 exp1
为真, exp2
计算,计算的结果是 exp2
的结果;如果 exp1
为假,exp3
计算,计算的结果是 exp3
的结果。
条件操作符的应用场景如下:
例 1:
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d", &a);
if (a > 5)
b = 3;
else
b = -3;
printf("%d\n", b);
return 0;
}
将以上代码用条件操作符来表示,有如下代码:
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d", &a);
b = a > 5 ? 3 :-3;
printf("%d\n", b);
return 0;
}
例 2:
实现找两个数中最大值。
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int m = a>b ? a : b;
printf("%d\n", m);
return 0;
}
1.3 逻辑操作符
逻辑运算符提供逻辑判断功能,用来构建更复杂的表达式,主要以下三个运算符。
!
逻辑取反运算符,就是非的意思(改变单个表达式真假)&&
逻辑与运算符,就是并且的意思(两侧的表达式为真,则为真,否则为假)||
逻辑或运算符,就是或者的意思(两侧至少有一个表达式为真,则为真,否则为假)
1.4 注意问题
- 注意
==
和=
的区别,==
是左边等于右边的意思,而=
是将右边的值赋值给左边的意思 - 多个关系运算符不宜连用,原因如下:
假设有三个变量i
、j
、k
,可以有表达式:
i < j < k
上方示例中,连续使用了两个小于运算符,这是合法表达式,并不会报错,但是通常达不到想要的效果,无法判断 j
的大小是否在 i
和 k
之间。由于关系操作符是从左到右计算的,所以执行的是下方的表达式:
( i < j ) < k
上方表达式中,i < j
的返回的值是 0
或 1
,所以接下来是 0
或 1
与 j
进行比较,与表达式原本的意思大相径庭,若想使表达式达到理想的效果,即判断 j
的大小是否在 i
和 k
之间,我们可以这样写:
i < j && j < k
2. 分支结构
2.1 if···else 语句
2.1.1 单分支 if 语句
if
语句的语法形式如下:
if(表达式)
语句
表达式为真,则语句执行,表达式为假,则语句不执行。
例:输入一个整数,判断是否为奇数
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num % 2 == 1)
printf("%d 是奇数\n", num);
return 0;
}
这个例子主要是想判断是否是奇数,是的话就输出奇数,不是则不输出。
2.1.2 双分支 if···else 语句
如果我们想要让代码输出的效果达到非此即彼,这个时候就需要用到 if···else
语句了,
语法形式如下:
if(表达式){
语句1
}
else{
语句2
}
例:输⼊⼀个整数,判断是否为奇数,如果是奇数打印是奇数,否则打印偶数。
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num % 2 == 1)
printf("%d 是奇数\n", num);
else
printf("%d 是偶数\n", num);
return 0;
}
2.1.3 多分支 if···else if···else 语句
若想让代码输出实现的效果多样化,我们可以选择 if···else if···else
语句,代码形式如下:
if(表达式1){
语句1
}
else if(表达式2){
语句2
}
else{
语句3
}
例:
科目三,输⼊车速v
如果车速v<30,输出“车速太低”;
如果车速v=30,输出“车速刚好”;
如果车速v>30,输出“车速太高”。
#include <stdio.h>
int main(){
int v = 0;
scanf("%d",&v);
if(v<30)
printf("车速太低");
else if(v=30)
printf("车速刚好");
else
printf("车速太高");
return 0;
}
多分支语句也称嵌套 if
语句,上述代码也可以写成:
#include<stdio.h>
int main(){
int v = 0;
scanf("%d",&v);
if(v<30){
printf("车速太低");
}
else{
if(v=30){
printf("车速刚好");
}
else{
printf("车速太高");
}
}
return 0;
}
这样写更容易理解。
2.2 switch 语句
switch
语句是⼀种特殊形式的 if...else
结构,⽤于判断条件有多个结果的情况,它把多重的 else if
改成更易用、可读性更好的形式。代码形式如下:
switch (expression) {
case value1: statement;
break;
case value2: statement;
break;
default: statement
}
break
语句:顾名思义“打破”,作用是跳出 switch
语句
用 break
语句来跳出 switch
语句,以此达到理想分支效果,不然会一直执行下去,直至 switch
语句的结束。
上⾯代码中,根据表达式 expression
不同的值,执行相应的 case
分⽀。如果找不到对应的值,就执行 default
分支。
注:
switch
后的expression
必须是整形表达式case
后的值必须是整形常量表达式case
和后面的数字之间必须有空格- 每一个
case
语句中的代码执行后,必须加上break
,才可以跳出这个switch
语句 - 在
switch
语句中case
语句和default
语句是没有顺序要求的,不过我们通常把default
语句放到最后
下面我们举两个例子来感受一下,switch
语句中 break
语句起到的作用:
例1:
输⼊:1 输出:星期⼀
输⼊:2 输出:星期⼆
输⼊:3 输出:星期三
输⼊:4 输出:星期四
输⼊:5 输出:星期五
输⼊:6 输出:星期六
输⼊:7 输出:星期天
#include<stdio.h>
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;
case 7:
printf("星期天\n");
break;
}
return 0;
}
例2:
输⼊1~5,输出的是“⼯作⽇”;
输⼊6~7,输出“休息⽇”
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch(day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("⼯作⽇\n");
break;
case 6:
case 7:
printf("休息⽇\n");
break;
}
return 0;
}
3. 循环结构
3.1 while 循环
while
语句可以实现循环效果,语法形式如下:
while(表达式)
语句;
若表达式为真,循环执行 while
中的语句,直至表达式为假,循环结束。
例:
在屏幕上打印0~9的值
#include<stdio.h>
int main(){
int i = 0;
while(i<10){
printf("%d",i);
i = i + 1;
}
return 0;
}
3.2 for 循环
for
循环是循环语句中使用最多的语句,语法形式如下:
for(表达式1;表达式2;表达式3)
语句
表达式1 用于循环变量的初始化
表达式2 用于循环结束条件的判断
表达式3 用于循环变量的调整
例:
计算1~100之间3的倍数的数字之和
#include <stdio.h>
int main()
{
int i = 0;
int sum = 0;
for(i=3; i<=100; i+=3)
{
sum += i;
}
printf("%d\n", sum);
return 0;
}
3.3 do - while 循环
while
和 for
这两种循环都是先判断再执行,而 do - while
循环是先执行一次代码再判断是否要循环。do - while
语句中,代码至少执行一次,代码形式如下:
do
语句;
while(表达式);
例:
输⼊⼀个正整数,计算这个整数是⼏位数?
输⼊:1234 输出:4
输⼊:12 输出:2
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
int cnt = 0;
do
{
cnt++;
n = n / 10;
} while (n);
printf("%d\n", cnt);
return 0;
}
这⾥并⾮必须使⽤ do - while
语句,但是这个代码就⽐较适合使用 do - while
循环,因为n即使是0,也是1位数,要统计位数的。
4. continue 和 break 语句
在循环执行的过程中,如果某些状况发生的时候,需要提前终止循环,这是非常常见的现象。C语言中提供了 break
和 continue
两个关键字,就是应用到循环中的。
break
的作用是永久终止循环,只要 break 被执行,就会跳出break
所在的整个循环体continue
的作用是跳过本次循环中continue
后边的代码
通俗点讲,break
可以跳出一个循环体,而 continue
只能跳出一个循环体中的一次循环。
5. goto 语句
goto
语句可以将程序跳转到同⼀个函数内设置好的标号处。
例:
#include <stdio.h>
int main()
{
printf("hello world!!\n");
goto next;
printf("1");
next://标号
printf("2")
return 0;
}
上方代码输出为:
hello world ! !
2