新人创作不易,希望各位客观点个赞关个注,我们一起来学习!(以后会继续法各种讲解)
感谢!!!!!!!!!!!!各位的点赞关注是我持续更新的动力【> - <】
1.if语句
2.关系操作符
3.条件操作符
4.逻辑操作符
5,switch语句
6.while循环
7.for循环
8.do-while循环
9.break和countinue语句
10.循环的嵌套
11.goto语句
正文开始
1. if语句
1.1 if语句基本语法句式如下:
#include<stdio.h>
int main()
{
if(表达式)
(语句)
return 0;
}
当表达式成立(为真)时,则if语句执行。若不成立(为假),则语句不执行。
举例1
#include<stdio.h>
int main()
{
if(1+1==2)
printf("你真棒")
return 0;
}
举例2
#include<stdio.h>
int main()
{
if(1+1==3)
printf("你真棒")
return 0;
}
在举例1与举例2中,1表达式成立,2表达式不成立。所以举例1结果可以正常输出(你真棒!)
举例2则不能。
此外在c语句中 0 代表假 1 代表真,所以当表达式结果为0时,语句不执行,结果为1时,语句执行。
举例3(数入一个数判断是否为判断奇数)
#include<stdio.h>
int main()
{
int n = 0;//初始化n=0
scanf("%d",&n);//输入一个数给n
if(n%2 == 1)//判断n余上2是否为1。如果是则返回出1,打印n.如果不是返回0,则不打印n。
printf("%d 为奇数",n);
return 0;
}
注意
1.在if语句中,(若没有大括号)则if语句只作为下一行代码的条件。若表达式下有多条语句注意要打大括号,在括号里的我们叫程序块或者复合语句。建议不管在哪种情况下都养成打括号的习惯。
举例(结果为6)
#include<stdio.h>
int main()
{
int n = 0;
if(1)
{
n=n+1;
n=n+2;
n=n+3;
}
printf("%d",n);
return 0;
}
#include<stdio.h>
int main()
{
int n = 0;
if (1)
n = n + 1;
n = n + 2;
n = n + 3;
printf("%d", n);
return 0;
}
此时第二个代码输出值为1,明显不是6。可知if下只运行了(n = n+1)这一行代码。而第一个代码由于打了大括号,三条语句都能被执行,输出为6。
1.2 else
如果一个数不是奇数,那就是偶数了,如果我们要输入任意数来判断是奇数还是偶数,这里就需要用if....else....语句,语法格式如下:
int main()
{
int n = 0;
scanf_s("%d", &n);
if (n % 2 == 1)
{
printf("%d 为奇数\n", n);
}
else//如果不是奇数则else为偶数
{
printf("%d 为偶数\n", n);
}
return 0;
}
练习1.
输入一个数,判断是否为3的倍数;是的话输出:是;否则输出:不是。
#include<stdio.h>
int main()
{
int n = 0;
scanf_s("%d", &n);
if (n % 3== 0)
{
printf("是");
}
else
{
printf("不是");
}
return 0;
}
注意:else和if一样当有多条语句需要被执行时一样要打大括号。
1.3 嵌套if
在 if else 语句中else 可以与别的另一个if 语句连用,构成多重判断。
例如:输入一个数,判断是0,正数还是负数。
#include<stdio.h>
int main()
{
int n = 0;
scanf_s("%d", &n);
if (n == 0)
{
printf("输入的数字是0\n");
}
else if (n > 0)
{
printf("输入的数字是正数\n");
}
else
{
printf("输入的数字是负数\n");
}
return 0;
}
从else if 的 if 开始,和下面else组合成为一个 if else语句,嵌套在上一个 if else 语句中,这就是嵌套语句。
此外,if语句中也能嵌套if 和 else(但是单个else中不能嵌套单个else)
例如
int main()
{
int n = 0;
scanf("%d", &n);
if (n > 0)
{
if (n > 100)//if里嵌套if
{
printf("n是正数且大于100\n");
}
else//if里嵌套else
{
printf("n是正数但小于100\n");
}
}
else//if里嵌套else
{
printf("n小于100\n");
}
return 0;
}
1.5 悬空else问题
如果有多个if 和 else,else总是和最近的if匹配。
int main()
{
int a = 0;
int b = 0;
if (a == 1)
if (b == 2)
printf("nihao");
else
printf("nihao");
return 0;
}
这个代码刚开始很多都以为会打印出nihao,但当真正去执行时,没有任何结果输出,这是为什么呢?
这个代码中,由于最后一个else和第一个if 是对齐的,让我们误以为这二者组成if else 语句。恰恰相反,这个语句中的else是和上一个(最近的if)组合,也就是说,这其实是一个 if else 语句嵌套在上一个if语句中。第一个if的表达式为这个符合语句前提条件,此时这表达式不成立,所以无结果。
这样容易理解些:
int main()
{
int a = 0;
int b = 0;
if (a == 1)
{
if (b == 2)
printf("nihao");
else
printf("nihao");
}
return 0;
}
如果我们要完成最后一个else和最前面的if组合,那我们可以这样子写:
int main()
{
int a = 0;
int b = 0;
if (a == 1)
{
if (b == 2)
printf("nihao");
}
else
{
printf("nihao");
}
return 0;
}
两个大括号将else 和 if 的语句分开,使代码更清晰。大家认识到大括号的重要性了吧!,还是推荐大家多多利用大括号!
2. 关系操作符
1.> 大于运算符
2.<小于下运算符
3.>=大于等于运算符
4.<=小于等于运算符
5.==相等于运算符
6.!=不向等于运算符
例子
a == b;
a != b;
a < b;
a <=b;
a > b;
a >=b;
这些表达式通常返回1或者0来表示真假。
C语言中0表示假,非0表示真。这些关系表达式通常用于if或者while结构。
if( x == 3)
{
printf("hhaha")
}
注意:== 符号和 = 符号不是一样的。==是赋值符号,将符号右边的值赋值给左边的变量(也就是说左右两边不可以互换)。而 = 号左右可以互换。不小心写错可以运行,但通常会影响结果!如果这代码中表达式写成(x = 3),则if判断此时永远成立,永远为真。
为避免这种情况我们可以加上:/*报错*/
/* 报错*/
if(x =3 )......
此时误写就会报错!
另一个就是要注意:多个关系运算符不宜连用。例如:u<o<p
此时通常不会报错,但由于此时关系运算符是从左边到右边计算,实际执行的是(u<o)<p。(u<o)执行完后返回的是0或者1。最后是0或者1和p进行比较,此时会产生不想要的结果。
如果想要判断变量o是否在u和p之间,我们可以这样写:
u < o && j < j;//此时&&指的是并且的意思
举例
输入一个岁数,如果在65到100之间,输出老年。
如果我们这样写:
int main()
{
int age = 0;
scanf("%d", &age);
if (65 <= age <= 100)
{
printf("老年\n");
}
return 0;
}
则我们有这样的结果:
10
老年
这是应为当我们表达式为(65<=age<=100) 时,我们先执行的时(65<=age)此时我们的age时输入值10,则(65<=10)不成立。返回0,再进行(0<100),此时表达式成立。打印“老年”。那我们应该怎么写呢?
int main()
{
int age = 0;
scanf_s("%d", &age);
if (65 <= age &&age<= 100)
{
printf("老年\n");
}
return 0;
}
这样写输出就是对的!
3. 条件操作符
条件操作符又名三目操作符,需要接受三个操作数的,例如:
exp1 ? exp2 :exp3
如果exp1为真则,exp2计算,结果是整个表达式结果;如果exp1为假,则exp3计算,结果为整个表达式结果。
练习1:使用条件表达式实现找出两个数中较大值
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;
}
4. 逻辑操作符:&&,||,!
逻辑运算符提供的是逻辑判断功能,用于构建复杂表达式,主要有以下三个:
1. ! :逻辑取反运算符(改变单个表达式的真假)
2. && :逻辑与运算符,就是并且的意思(两侧都为真,则为真,一侧为假则全部为假)。
3. || :逻辑或运算符,就是或者的意思(两则只要有一边为真,则为真,否则为假。)
4.1 逻辑取反运算符 !
我们取一个变量为flag,r如果flag为假,要做什么事情,这可以这样写:
int main()
{
int flag = 0;
if (!flag)
{
printf(" hahahahahahahha");
}
return 0;
}
flag为假,但!flag为真,就可以执行下面代码!
4.2 逻辑与运算符
&&就是并且的意思,&&是个双目操作符(&&两边都得有表达式例如a&&b)。只有两边都为真时表达式才真,只要有一个假,整个都是假的。
举例:
输入一个月份,判断是否为夏季:
int main()
{
int month = 0;
scanf("%d", &month);
if (month > 5 && month <= 8)
{
printf("夏季");
}
return 0;
}
就是month得同时满足大于5下雨等于8。
4.3 逻辑或运算符
||就是逻辑或运算符,或者的意思。II也是一个双目操作符(a||b)。也就是说,符号两边表达式只要有一个真,表达式整体就是真,两边都为假时,整体才为假。
举例:
输入12月或者1月或者2月是冬天的代码:
int main()
{
int month = 0;
scanf("%d", &month);
if (month ==12 ||month==1||month==2)
{
printf("冬季");
}
return 0;
}
4.4 闰年的判断
输入一个年份,判断是否为闰年。
判断规则(能被4整除并且不被100整除的是闰年。能被400整除的是闰年)
法1:
int main()
{
int year = 0;
scanf("%d", &year);
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
{
printf("是闰年");
}
return 0;
}
法2:
int main()
{
int year = 0;
scanf("%d", &year);
if (year % 4 == 0 && year % 100 != 0)
{
printf("是闰年");
}
else if (year%400==0)
{
printf("是闰年");
}
return 0;
}
4.5 短路
C语言的逻辑运算符有一个特点,它总是从左到右求值。
如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。如前面的代码:
if( month > 5 && month < = 8 )
当左边代码不成立时 ,即使不判断右边的表达式,整个表达式的结果也是0。
所以,对于&&操作符来说,左边操作数的结果是0的时候,右边的不再执行。
对于||操作符是怎么样呢?我们再结合前面代码:
if (month ==12 ||month==1||month==2)
如果month ==12,则不再用判断,整个表达式也是1。so,|| 左边操作数结果不为0是,无需执行右边的操作数。
像这种看左边知全部的,称为(“短路求值”)。
练习:
求计算结果
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;//需要注意前置++和后置++
//i= a++||++b||d++
printf("a = %d b = %d c = %d ", a, b, c, d);
return 0;
}
5. switch语句
除了if外,C语言还提供了switch来实现分支结构。
switch是一种特殊形式的if...else结构,判断有多个结果的情况。把多重的else if改成更易用的的形式。
switch (expression)
{
case 1:haha
case 2:haha
default:haha
}
在上面代码中,根据表达式espression不同的值,执行相应的case分支,如果找不到对应的值,就执行default分支。
注意:switch 后的espression中必须是整形表达式且case后的值必须是常量表达式
5.1 if语句和switch语句的对比
练习:输入一个整数值,算其除2的余数
if语句完成如下
int main()
{
int n = 0;
scanf_s("%d", &n);
if (n % 2 == 0)
{
printf("整除,余数为0\n");
}
else if (n % 2 == 1)
{
printf("余数为1\n");
}
else
{
printf("余数为2\n");
}
return 0;
}
switch语句如下:
int main()
{
int n = 0;
scanf_s("%d", &n);
switch (n % 2)
{
case 0:
printf("整除,余数为0\n");
break;
case 1:
printf("余数为1\n");
break;
case 2:
printf("余数为2\n");
break;
}
return 0;
}
注意:1.case后和数字间要有空格
2.每一个case语句最后都有一个break,只有加上这个break,才能跳出这个switch语句。
5.2 switch语句中的break
在前面代码中去掉break会怎么样呢?
int main()
{
int n = 0;
scanf_s("%d", &n);
switch (n % 2)
{
case 0:
printf("整除,余数为0\n");
case 1:
printf("余数为1\n");
case 2:
printf("余数为2\n");
}
return 0;
}
我们可以看到,8余2应该是为0 ,但多了两行其他打印这还是为什么呢?
原因是switch是有分支效果的,只有在switch语句中使用break才可以跳出switch语句,如果一个case后面没有break则即便它成立它也会继续执行下面其它case,直到遇到break或者switch语句才结束。
所以break在switch语句中尤为重要!
当然也不是所有情况下都要加break。例如:
举例:
输入1-5,输出工作日;
输入6-7,输出休息日;
int main()
{
int day = 0;
scanf_s("%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;
}
在上面的代码中,我们知道当多种可能的结果相同时,它们中间不要加break。所以我们要根据实际要求,来加break,才能正确的完成实际要求!
5.3 switch中的default
在使用switch语句时,我们经常会遇到switch后的表达式中值无法匹配代码中的case语句时,无法处理的情况,这时,我们就要加上default子句
就像前面工作日的练习,如果day大于7或者小于1,如果我们此时要提出:输入错误,就可以如下完成代码:
int main()
{
int day = 0;
scanf_s("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
default:
printf("输入错误\n");
}
return 0;
}
5.4 switch语句中的case和default的循序问题
case和default字句有顺序要求吗?default只能放在最后吗?
其实在switch语句中case语句和default语句是没有顺序要求的,只要满足实际需求就可以。不过我们习惯将default放在最后处理。
6. while循环
C语言提供了3中循环语句,while就是其中的一种,接下来介绍一下。while语句的与大结果和if非常相似。
6.1 if 和while的对比
if(表达式)
语句;
while(表达式)
语句;//想加上更多语句要加上大括号
咋们再分开写出来:
int main()
{
while (1)
printf("hehe\n");
return 0;
}
int main()
{
if (1)
printf("hehe\n");
return 0;
}
由此观之,while拥有循环效果。
6.2 while语句的执行流程
首先上来判断表达式,表达式的值为0,循环直接结束;表达式结果不为0,则执行循环语句,语句执行完后再继续判断,是否进入下一个循环。
6.3 while循环的实践
练习1.
再屏幕上打印1-10的值
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i = i + 1;
}
return 0;
}
7. for循环
7.1 语法形式
for循环时三种循环中使用的最多的,形式如下:
for(表达式1;表达式2;表达式3)
语句;//如果想包含更多语句,要打大括号
表达式一 用于循环变量的初始化.
表达式二 用于循环条件结束的判断
表达式三 用于循环变量的调整
7.2 for循环的执行流程
首先执行 表达式一 初始化循环变量,接下来执行 表达式二 的判断部分,表达式二的结果如果==0,则循环结束;表达式二的结果如果!=0则执行循环语句,循环语句执行完后,再去执行 表达式三 ,调整循环变量,然后再去 表达式二 的地方执行判断,表达式二的结果是否为 0,决定循环是否继续!
整个循环中,表达式一初始化部分只被执行1次,剩下的就是表达式2,循环语句,表达式三在循环。
7.3 for循环的实践
练习:
在屏幕上打印1-10的值
int mian()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d", i);
}
return 0;
}
7.4 while循环和for循环的对比
int mian()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d", i);
}
return 0;
}
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i = i + 1;
}
return 0;
}
for循环和while循环都有初始化,判断,调整,这三个部分,但是for循环的三个部分非常集中,便于维护,如果代码较多则while循环三个部分就很分散,所以形式上for循环形式更优一点。
7.5 练习
计算1-100间的3的倍数的数字和
int mian()
{
int i = 0;
int sum = 0;
for (i = 3; i <= 100; i+=3)
{
sum = sum + 1;//sum+=1
}
printf("%d\n", sum);
return 0;
}
8. do-while 循环
8.1 循环语句中do-while语句的使用最少,其语法如下:
do
语句;
while(表达式);
while和for循环语句都是先判段后循环,do-while语句则是先进入循环后判断表达式是否为真,真的话进入下一循环,若为假则跳出循环。
8.2 do while 循环的执行流程
在 do while 循环中先执行语句,执行完后执行”判断表达式“,判断表达式!=0,则继续循环,执行循环语句;表达式==0,则循环结束。
所以 do while 语句中循环体至少循环一次,这是其特殊处。
8.3 do while 循环的实例
在屏幕上打印1-10的值
int main()
{
int i = 0;
do
{
printf("%d ", i);
i = i + 1;
} while (i <= 10);
return 0;
}
一般 do while 使用在循环体至少一次的场景下,所以使用不多。
9. break和continue 语句
在循环时,如果发生情况需要提前终止循环,这是非常常见的现象。C语言提供了break和continue两个关键字,下运用到循环中。
break 的做用是终止循环,只要break被执行,直接跳出循环,继续往后执行。
continue 的做用是跳过本次循环中continue 后面的代码,在 for 和 while循环中有所差异。
9.1 while循环中的break和continue
9.1.1 break举例
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
break;
printf("%d", i);
i = i + 1;
}
return 0;
}
打印了1,2,3,4后,当i ==5时,循环在break处终止,不再打印,不再循环。
所以break是终止循环时使用的。
9.2 for循环中的break和continue
9.2.1 break 举例
其实和while循环中一样,for循环中break也是用于终止循环的,只要到了break就终止。
int main()
{
int i = 1;
for (i = 1; i <= 10; i++)
{
if (i == 5)
break;
printf("%d ", i);
}
return 0;
}
break是真的终止循环,当我们不再想循环时,用break。
9.2.2 continue举例
int main()
{
int i = 1;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;//跳过了后面的部分,直接来到了i++
printf("%d", i);
}
return 0;
}
for循环中continue的做用是跳过本次循环中continue后的代码,直接去循环调整部分。
9.3 do while循环中的 dreak和continue
其与while中的基本一样,这里不再展开讲述。
10. 循环的嵌套
这三种循环都可以相互嵌套,而且通常三种嵌套在一起能更好的解决问题。
练习
找出100-200 之间找出素数,答应在屏幕上。
素数又称质数,只能被1和本身整除。
int main()
{
int i = 0;
//循环产生100-2001间的数字
for (i == 100; i <= 200; i++)
{
//判断i是否为素数
//循环产生2到i-1之间的数字
int j = 0;
int flag = 1;//假设i是素数
for (i = 2; i < i; i++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
printf("%d", i);
}
}
return 0;
}
11. goto 语句
C语言内提供的一种特殊的语法,就是goto语句和跳转符号,goto可以实现在同一函数中内跳转到设置好的标号处。
例如:
int main()
{
printf("hehe\n");
goto next;
printf("haha\n");
next:
printf("跳过了haha的打印\n");
return 0;
}
goto 语句虽然简便,但使用不当容易打乱执行流程,所以我们尽量不去用;但是goto语句也不是一无是处,在想跳出多层循环代码的情况下,十分方便(break只能跳出一层循环)。
for (......)
{
for (.......)
{
for (.........)
if (disaster)
goto error;
}
}
error:
.........
for循环中,一个break只能跳出一个循环,当多层循环时 goto 语句更方便。