C语言是一种结构化的程序设计语言,这里的结构指的是顺序结构,选择结构,循环结构
我们可以使用if,switch实现选择结构,使用for,while,do while 实现循环结构
关系操作符
>:大于
<:小于
>=:大于等于
<=:小于等于
==:相等
!=:不相等
多个关系符不宜连用
关系表达式常用于if或while结构
条件操作符
条件操作符也叫三目操作符,形式如下
exp1 ? exp2 : exp3
条件操作符的计算逻辑:如果exp1为真,exp2计算,计算的结果是整个表达式的结果;如果exp1为假,exp3计算,计算的结果是整个表达式的结果
可以实现找两个数中较大值,如下
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
printf("请随机输入两个数字:\n");
scanf("%d%d", &a, &b);
int c =( a > b ? a : b);
printf("两个数中较大值为:%d\n", c);
}
逻辑操作符:&&,||,!
C语言中,非0表示真,0表示假
逻辑与运算符:&&
&&:并且,两边的表达式都为真,则为真,否则为假;有一个为假,则为假
逻辑或运算符:||
||:或者,至少有一个为真,则为真,否则为假;只有两边都为假,才为假
逻辑非运算符:!
!:改变单个表达式的真假
运用上面的条件操作符来举个例子,如下
#include <stdio.h>
int main()
{
int year = 0;
printf("请输入年份:");
scanf("%d", year);
if(((yaer % 4 == 0)&&(year % 100 != 0))||(year % 400 == 0))
{
printf("%d是闰年\n", year);
}
else{
printf("%d不是闰年\n", year);
}
}
短路
C语言逻辑运算符还有一个特点,它总是先对左侧表达式求值,再对右边的表达式求值。如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值,这种情况称为短路。
以上面的代码举例
if(month >= 3 && month <= 5)
这种情况下,如果左边的month >= 3结果为0,右边的month <= 5就不判断,整个表达式的结果为0。
对于||的结果如下
if(month == 12 || month == 1 || month == 2)
如果month == 12,则不用再判断month是否等于1或者2,整个表达式结果为1
if语句
if
if的语法形式如下,当语句不长时可以这样写
if(表达式)语句
或者
if (表达式)
语句
长语句如下
if (表达式)
{
语句
}
表达式为真,则语句执行,表达式为假,则语句不执行
在C语言中,0为假,1为真,即表达式结果为0不执行,为1执行
举个例子如下 判断输入的数是否为偶数
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num % 2 == 0) printf("%d是偶数", num);
}
else
就是if语句条件为假时,执行else语句,继续使用上面的例子,如下
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num % 2 == 0)
printf("%d是偶数", num);
else
printf("%d是奇数", num);
}
分支中包含多条语句
默认情况下,if和else后面只能跟一条语句,使用多条语句时,就是上面说到的长语句情况,即用{}包裹需要表达的语句
嵌套if
在if else语句中,else可以与另一个if语句连用,构成多重判断
比如:要对输入的数字进行判断,是正数还是负数还是0
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num == 0)
printf("输入的数字是0", num)
else
{
if(num > 0)
printf("%d是正数", num);
else
printf("%d是负数", num);
}
}
另外几种写法
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num == 0)
printf("输入的数字是0", num)
else if(num > 0)
printf("%d是正数", num);
else
printf("%d是负数", num);
}
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num >= 0)
{
if(num = 0)
printf("输入的数字是0", num);
else
printf("%d是正数", num);
}
else
{
printf("%d是负数", num);
}
}
写法有多种,想写哪种都行
悬空else
如果有多个if和else,else总是与最近的if匹配
举个例子
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if(b == 2)
printf("haha\n");
else
printf("nihao\n");
}
上面的程序输出结果是什么呢?
结果是什么都不输出
这个else是和最近的表达式(b == 2)的if语句匹配的,但是这个if语句并没有执行,因为在它的上一层还有一个if语句,但是它的表达式为(a == 1),而全局变量a的值为0,所以这个表达式不执行,导致后面的表达式都不执行
switch语句
switch语句是一种特殊形式的if...else结构,用于判断有多个结果的情况 结构如下
switch(expression){
case value1: statement
case value2: statement
default: statement
}
上面代码中,根据表达式expression不同的值,执行相应的case分支。如果找不到,就执行default分支。
其中:switch后的expression必须是整型表达式(字符型也归类到整型);case后的值必须是整型常量表达式
if语句与switch语句的对比
例如:计算任意一个整数值除5后的余数
#include <stdio.h>
int main(){
int a = 0;
scanf("%d", &a);
if(a % 5 == 0)
printf("余数为0\n");
else if(a % 5 == 1)
printf("余数是1\n");
else if(a % 5 == 2)
printf("余数是2\n");
else if(a % 5 == 3)
printf("余数是3\n");
else
printf("余数是4\n");
}
如果是switch语句 如下
#include <stdio.h>
int main(){
int a = 0;
scanf("%d", &a);
switch(a % 5){
case 0:
printf("余数为0\n");break;
case 1:
printf("余数为1\n");break;
case 2:
printf("余数为2\n");break;
case 3:
printf("余数为3\n");break;
case 4:
printf("余数为4\n");break;
}
}
switch语句中的break
如果没有break,每个case语句都执行一遍,直到所有的case语句执行完
switch语句中的default
处理所有case不能匹配的情况
switch语句中的case与default的顺序问题
在switch语句中case语句和default语句没有顺序要求,满足实际需求即可,通常将default语句放在最后
for循环
for循环使用的比较多,语法如下
for(表达式1;表达式2;表达式3)
语句; // 如果有更多的语句,可以加上大括号
表达式1:用于循环变量的初始化(初始化只执行一次)
表达式2:用于循环结束条件的判断
表达式3:用于循环变量的调整
for循环首先执行表达式1,然后是表达式2,接着执行语句部分,最后执行表达式3
举例如下
int main(){
int i = 0;
for(i = 1; i <= 100; i++)
{
printf("%d", i);
}
}
while循环
while是C语言三种循环中的一种,语句结构与if语句有点类似
语法如下
while(表达式1){
语句;
表达式2;
}
表达式1:循环条件的判断
表达式2:循环变量的调整
与for循环不同的是,初始化部分在while前面
if和while的对比
例如 if 语句
int main(){
int a = 5;
if(a > 0)
printf("你好\n");
}
while语句如下
int main(){
int a = 5;
while(a > 0)
printf("你好\n");
}
但是while语句这种情况下会死循环,因为条件一直是满足的,所以会一直执行下方的printf,打印你好。
while语句的执行
首先判断表达式为真还是假,为真执行语句,然后返回判断表达式,判断真假。如果有一次为假,while语句结束。
do...while语句
这种语句使用较少,语法如下
do
语句
while(表达式)
do...while语句是进入循环体,再执行while后的判断表达式,表达式为真就会进行下一次,为假就不会继续循环。也就是说至少会执行一次。
break与continue语句
在循环执行的过程中,如果发生某些状况,需要提前终止循环。C语言中提供了break和continue两个关键字应用到循环中来实现这些功能。
break:是永久终止循环,执行后跳出循环继续往后执行
continue:是跳过本次循环中continue后面的代码,在for循环和while循环中有所差异
while中的break和continue
break如下
#include <stdio.h>
int main(){
int i = 1;
while(i <= 10){
if(i == 5)
break;
printf("%d", i);
i = i + 1;
}
}
如果没有break,运行结果会打印从1到10这十个数字,但是加了break后,循环就会从5终止,打印出1到4这四个数字。
continue如下
#include <stdio.h>
int main(){
int i = 1;
while(i <= 10){
if(i == 5)
continue;
printf("%d", i);
i = i + 1;
}
}
加了continue后,在符合条件i==5时,跳过了printf与控制部分,此时没有改变值,控制台会打印1到4四个数字,然后不停地执行判断语句,进入死循环。
但是如果只是想跳过其中某一个数字,只需要将控制部分放到判断前面,就可以实现。
for循环中的break和continue
break举例
#include <stdio.h>
int main(){
int i = 0;
for(i = 1; i <= 10; i++){
if(i == 5)
break;
printf("%d", i);
}
}
结果与while一样
continue举例
#include <stdio.h>
int main(){
int i = 0;
for(i = 1; i <= 10; i++){
if(i == 5)
continue;
printf("%d", i);
}
}
此时控制台打印除5以外的1到10的数字,这里与while不同。这种情况也不会死循环。
do...while中的break与continue
break举例
#include <stdio.h>
int main(){
int i = 1;
do
{
if(i == 5)
break;
printf("%d", i);
i = i + 1;
}
while(i <= 10);
}
此时情况几乎相同,也是打印1到4
continue举例
#include <stdio.h>
int main(){
int i = 1;
do
{
if(i == 5)
continue;
printf("%d", i);
i = i + 1;
}
while(i <= 10);
}
与while一样,打印1到4 就死循环 跳过了控制部分
循环的嵌套
通常将 for、while、do...while这三种循环嵌套在一起才能更好的解决实际问题,这就是常说的循环嵌套。
下面举一个例子
问题是,有100元,想买100只鸡,其中公鸡五元一只,母鸡三元一只,小鸡一元三只,能买到多少只公鸡,母鸡,小鸡
此时通常想到使用穷举法,即公鸡五元一只,那么最多20只,而母鸡三元一只,最多能买33只,小鸡就是100减去公鸡与母鸡的数量。最后再列钱的等式,结果如下
#include <stdio.h>
int main() {
int x, y, z; // x表示公鸡的数量,y表示母鸡的数量,z表示小鸡的数量
for (x = 0; x <= 20; x++) {
for (y = 0; y <= 33; y++) {
z = 100 - x - y;
if (5 * x + 3 * y + z / 3 == 100 && z % 3 == 0) {
printf("公鸡:%d只,母鸡:%d只,小鸡:%d只\n", x, y, z);
}
}
}
return 0;
}
其中的for可以换成while,想用while就可以改变一下,将变量的初始化写在前面,括号中只留下判断表达式,将调整语句放在while代码块的最后一句。这里就不列举了。
如果需要打印一些数字呢?我们应该怎么办?请看下面的例子
从1到100中出现了多少个数字9?请打印出来
这个问题首先想到的也是for循环,根据这个问题,还可以想到,使用if来判断两个条件,因为个位和十位都会出现这个数字,那么话不多说,上代码
#include <stdio.h>
int main()
{
int num = 0, sum = 1;
for (num = 19; num <= 100; num++) {
if (num % 10 == 9) {
sum++;
}
if (num / 10 == 9) {
sum++;
}
}
printf("%d", sum);
}
就先举两个简单的例子,希望上面的内容对你们有所帮助