目录
C语言结构有三种:顺序、选择、循环,用此三种结构就可以表示日常的所有情况。可用if、swhitch实现选择结构,用for、while、do while实现循环结构。
1.if语句
1.1 if
语法形式:
if ( 表达式 )
语句
表达式成立(为真),语句执行;表达式不成立(为假),语句不执行。
C语言中,0为假,非0为真。
例:输⼊⼀个整数,判断是否为奇数
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num % 2 == 1)
printf("%d 是奇数\n", num);
return 0;
}
1.2 else
仍然是上面1.1中的例子,一个数如果不是奇数就是偶数,如何表示呢?
此时就需要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;
}
1.3分支中包含多条语句
默认if
和else
语句是只控制一条语句,若想控制多条语句需要在if
或else
后加{}
。
例:
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age >= 18)
{
printf("成年了\n");
printf("可以恋爱咯\n");
}//if后加了一个{},如果age>=18成立执行if后{}中的两条语句
else
{
printf("未成年\n");
printf("不可以早恋哦\n");
}//else后加了一个{},如果age>=18不成立执行else后{}中的两条语句
return 0;
}
1.4嵌套if
1.在if else
语句中,else
可与另一if
语句连用构成多重判断。
例:要求输⼊⼀个整数,判断输⼊的整数是0,还是正数或者负数:
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num == 0)
printf("输⼊的数字是0\n");
else if(num > 0) //这⾥的if 相当于嵌套在els语句中,形成了嵌套结构
printf("输⼊的数字是正数\n");
else
printf("输⼊的数字是负数\n");
return 0;
}
2.还有一种就是嵌套在if
语句中,构成了嵌套if
语句。
例:要求输⼊⼀个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数则输出不是整数:
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num>0)
{
if(num%2 == 0)
printf("偶数\n");
else
printf("奇数\n");
}
else
{
printf("输⼊的值是负数\n");
}
return 0;
}
1.5悬空else问题
若有多个if
和else
,只需记住else
总是跟最接近if匹配。
例:
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
上例相当于:
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
{
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
}
return 0;
}
2.关系操作符
⽤于⽐较的表达式,称为 “关系表达式”,⾥⾯使⽤的运算符就称为“关系运算符”,主要有:
• < ⼩于运算符
• >= ⼤于等于运算符
• <= ⼩于等于运算符
• == 相等运算符
• != 不相等运算符
·关系表达式通常返回 0 或 1 ,表⽰真假。
·关系表达式常⽤于 if
或 while
结构。
另⼀个需要避免的错误是:多个关系运算符不宜连⽤。
例:
i < j < k
上例中,因为关系运算符是从左到右(接合方向)计算,所以实际执⾏为:
(i < j) < k
又因为i < j
返回 0
或 1
,所以最终是 0
或 1
与变量 k
进⾏⽐较。如果想要判断变量 j
的值是否在 i
和 k
之间应写为:
i < j && j < k
3.逻辑操作符:&& , || , !
• ! :逻辑取反运算符(改变单个表达式的真假)。
• && :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
• || :或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。
注:C语⾔中,⾮0表⽰真,0表⽰假
3.1短路
C语⾔逻辑运算符有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值。如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。
例:
if(month >= 3 && month <= 5)
上例中,程序先判断month>=3
,如果month>=3
不成立,则右边month<=5
将不再被执行,整个表达式的结果为假。
对||
同理,
例:
if(month == 12 || month==1 || month == 2)
如果month==12
成立,则右边的表达式都将不再被执行,整个表达式的结果为真。
4.switch语句
switch
语句是一种特殊的if else
结构,用于判断有多个结果的情况。
switch (expression)
{
case value1: statement
case value2: statement
default: statement
}
上⾯代码中,根据表达式 expression
不同的值,执⾏相应的 case
分⽀。如果找不到对应的值,就执⾏ default
分⽀。
注:
• switch
后的 expression
必须是整型表达式
• case
后的值,必须是整形常量表达式
例:
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch(n%3)
{
case 0:
printf("整除,余数为0\n");
break;
case 1:
printf("余数是1\n");
break;
case 2:
printf("余数是2\n");
break;
}
return 0;
}
上例中,需注意:
case
和后边的数字之间必须有空格- 每⼀个
case
语句中的代码执⾏完成后,需要加上break
,才能跳出这个switch
语句。
4.1switch语句中的break
在上面的switch
语句例子中,如果去掉break
:
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch(n%3)
{
case 0:
printf("整除,余数为0\n");
case 1:
printf("余数是1\n");
case 2:
printf("余数是2\n");
}
return 0;
}
打印结果为:
会发现打印结果中多了一行“余数是2”的打印。原因是在switch
语句中是用break
跳出switch
语句的,如果case
后无break
语句,代码就会继续向下执行。
4.2switch语句中的case和default顺序问题
在 switch
语句中 case
语句和 default
语句是没有顺序要求的,即default
语句既可以放在最后也可以放在中间、前面等任意位置,不过我们一般把default
语句放在最后处理。
5.while循环
while
循环格式:
while(表达式)
语句;
5.1while语句的执行流程
5.2练习
输⼊⼀个正的整数,逆序打印这个整数的每⼀位。
例:
输⼊:1234,输出:4 3 2 1
输⼊:521,输出:1 2 5
题目解析:
- 要想得到n的最低位,可以使⽤n%10的运算,得到的余数就是最低位,如:1234%10得到4
- 要想去掉n的最低位,找出倒数第⼆位,则使⽤ n=n/10 操作就可以去掉最低位的,如:n=1234/10得到123,123%10就得到倒数第⼆位3。
- 循环1和2两个步骤,在n变成0之前,就能到所有的位。
代码实现如下:
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
while(n)
{
printf("%d ", n%10);
n /= 10;
}
return 0;
}
6.for循环
6.1语法形式
for
循环是三种循环中使⽤最多的, 其语法形式如下:
for(表达式1; 表达式2; 表达式3)
语句;
表达式1 ⽤于循环变量的初始化
表达式2 ⽤于循环结束条件的判断
表达式3 ⽤于循环变量的调整
6.2 for循环的执行流程
6.3练习
计算1~100之间3的倍数的数字之和。
参考代码:
#include <stdio.h>
int main()
{
int i = 0;
int sum = 0;
for(i=1; i<=100; i++)
{
if(i % 3 == 0)
sum += i;
}
printf("%d\n", sum);
return 0;
}
//⼩⼩的优化
//如果能直接产⽣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;
}
7.do while循环
7.1语法格式
do
语句;
while(表达式);
前面的while
和for
两种循环都是先判断再循环,而do while
则是先循环再判断。所以在 do while
语句中循环体是⾄少执⾏⼀次的,这是 do while
循环⽐较特殊的地⽅。
7.2do while循环的执行流程
⼀般 do while
使⽤在循环体⾄少被执⾏⼀次的场景下,所以较少⼀些。
7.3练习
输⼊⼀个正整数,计算这个整数是⼏位数?
例如:
输⼊: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;
}
8.break和continue语句
在循环执行过程中,若遇到某些情况发生需提前结束循环则需用到break
和continue
两关键字。
• break
的作⽤是⽤于永久的终⽌循环,只要 break
被执⾏,直接就会跳出循环,继续往后执
⾏。
• continue
的作⽤是跳过本次循环 continue
后边的代码,在 for
循环和 while
循环中有所
差异的。
8.1while循环中的break和continue
8.1.1break举例
```c
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
break;//当i等于5后,就执⾏break,循环就终⽌,跳出循环。
printf("%d ", i);
i = i+1;
}
return 0;
}
运行结果:
8.1.2continue举例
仍旧是上面的例子,将break
换成continue
后:
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
continue;
//当i等于5后,就执⾏continue,直接跳过continue后的代码,去执行判断语句
//因为这⾥跳过了i = i+1,所以i⼀直为5,程序陷⼊和死循环
printf("%d ", i);
i = i+1;
}
return 0;
}
8.2for循环中的break和continue
8.2.1 break举例
其与while
循环中的break
一样。
例:
#include <stdio.h>
int main()
{
int i = 1;
for(i=1; i<=10; i++)
{
if(i == 5)
break;
printf("%d ", i);
}
return 0;
}
运行结果:
8.2.2 continue举例
还是上面的例子,将break
换成continue
后:
#include <stdio.h>
int main()
{
int i = 1;
for(i=1; i<=10; i++)
{
if(i == 5)
continue;//这⾥continue跳过了后边的打印,直接来到了i++的调整部分
printf("%d ", i);
}
return 0;
}
所以在 for
循环中 continue
的作⽤是跳过本次循环中 continue
后的代码,直接去到循环的调整部分。与while
循环中的continue
有区别。
8.3 do while循环中的break和continue
do while
语句中的 break
和 continue
的作⽤和 while
循环中⼏乎⼀样。
9.循环的嵌套
前⾯介绍了三种循环 while , do while , for ,
这三种循环往往会嵌套在⼀起才能更好的解决问题。
例:
找出100~200之间的素数,并打印在屏幕上。
注:素数⼜称质数,只能被1和本⾝整除的数字。
题目解析:
- 要从100-200之间找出素数,⾸先得有100~200之间的数,这⾥可以使⽤循环解决。
- 假设要判断i是否为素数,需要拿2-i-1之间的数字去试除i,需要产⽣2~i-1之间的数字,也可以使⽤
循环解决。 - 如果2~i-1之间有数字能整除i,则i不是素数,如果都不能整除,则i是素数。
参考代码:
#include <stdio.h>
int main()
{
int i = 0;
//循环产⽣100~200的数字
for(i=100; i<=200; i++)
{
//判断i是否为素数
//循环产⽣2~i-1之间的数字
int j = 0;
int flag = 1;//假设i是素数
for(j=2; j<i; j++)
{
if(i % j == 0)
{
flag = 0;
break;
}
}
if(flag == 1)
printf("%d ", i);
}
return 0;
}
10.goto语句
C语⾔提供了⼀种⾮常特别的语法,就是 goto
语句和跳转标号, goto
语句可以实现在同⼀个函数
内跳转到设置好的标号处。
例:
#include <stdio.h>
int main()
{
printf("hehe\n");
goto next://直接跳转到到next,执行next后面的代码
printf("haha\n");
next:
printf("跳过了haha的打印\n");
return 0;
}