目录
c语言是结构化的程序设计语言,结构指的是顺序结构、选择结构、循环结构
if、switch实现分支,for、while、do while实现循环结构
if
基本
if (表达式)//表达式成立则为真,执行语句,不成立为假,则不执行
语句
c语言中,0为假,非0为真
#include <stdio.h>
int main()
{
int num=0;
scanf("%d",&num);
if (num ==1)
printf("%d 是符合的数字",num);
return 0;
}
//满足条件输出,不满足条件退出结构,继续运行程序
else
基本格式,用于只有2种情况,且不管什么情况,都会执行其中一条语句
if(表达式)
语句1
else
语句2
若要判断奇数偶数,可以用else
int num=0;
scanf("%d",&num);
if (num % 2=0)
printf("%d是偶数",num);
else
printf("%d是奇数",num);
if和else语句默认只控制一条语句
if age(>=18)
printf("成年了";
printf("可以谈恋爱了";
这里,不管是否满足条件,可以谈恋爱,这句话都会输出
若要控制多条语句,需要用{}将语句括起来,else后也可以加上{},这个区域叫做程序块或复合语句
if (age>=18)
{
语句1
语句2
}
else
{
语句1
语句2
}
嵌套if
else后可以跟if构成else if语句
int c=0;
scanf("%d",&c);
if (c==1)
printf("1");
else if(c=2)
printf("2");
else
printf("其他")
这里,一共会出现3种情况,等于1时,会是输出1,等于2时会输出2,其他不等于不等于2的情况,都会输出其他
else后面的if else,都是嵌套在第一个else里的
另一种写法
int c=0;
scanf("%d",&c);
if (c==1)
printf("1");
else
{
if(c=2)
printf("2");
else
printf("其他")
}
悬空else
若有多个if和else
else则总是跟最接近的if匹配
int a=0;
if (a==1)
if (b==2)
printf("1");
else
printf("111";
//最终结果是都不输出,因为else是跟着上面的if
//如果a不等于1,那后面嵌套的if else,全都不会执行
//可以这么写
int a=0;
if (a==1)
{
if (b==2)
printf("1");
}
else
printf("111");
关系操作符
c语言中用于比较的表达式,称为关系表达式,用的操作符叫做关系运算符
> 小于
< 大于
>= 大于等于
<= 小于等于
== 等于
!= 不等于
a>b
a<b
a>=b
a<=b
a==b
a!=b
关系表达式会返回0或1,表示假真
常用于if或while语句
赋值跟关系是不一样的,建议相等时,常量放左边,变量放右边
x=3//这个表达式会返回值就是3,所以若放在if、while语句中,可能出现意外
3=x//放在if表达式里,会判断错误
可以连续使用关系运算符,但不建议用。
i<k<j//由于从左到右,所以实际是(j<k)<k
若要判断是否介于中间
i<j && j <k
逻辑操作符
! 逻辑取反
&& 与运算符,两边都为真,则为真,否则为假
|| 或运算符,两边有至少1个真,就为真,否则就为假
! 逻辑取反
flag=0;
//iflag就是非0,即为真
if (!flag)
printf("1");
//最后还是会执行语句,输出1
&& 与运算符
双目操作符
j=5 && k=5;
//这个表达式的返回值
//如果j和k都是5,都为真,整体返回值才会是真
//一旦有一个不是真,那返回值就是假,两个都不是真,也是假
若要说一段时间
1<c && c<7;
//最后,c是大于1,小于7的
或运算符
j=5 || k=5;
//若j和k都是5,两边都是真,整体返回值也是真
//若J和k其中一个是5,则其中一边为真,整体返回值也是真
//若j和k都不是5,则两边都是假,整体返回值就是假
短路
对于逻辑运算符而言,总是先对左边的表达式求值,然后再对右边求值。
year=0;
year==1 && month==2;
//由于year==0,所以,左边的表达式结果是0,整个表达式的结果就会是0。
//不对右边的表达式进行判断
//或运算也是如此,如果左边的表达式为真,那整个表达式就是真
//同样不对右边表达式进行求值
因此,仅仅根据左表达式的结果就能知道整个表达式的结果,不再对右边表达式进行计算的运算,称为短路。
switch语句
switch语句是一种特殊的if .....else结构,用于判断条件有多个结果的情况。
switch (表达式,可以为为整型、字符型、枚举型)
{
case 值1(表达式):语句
case 值2:语句//case与后面的数字必须有一个空格
default:语句//如果所有case情况都不满足,就执行default的语句
}
//当满足case的某个条件并执行了相应的语句后或执行了fdefault语句之后
//需要用break语句来结束判断,否则会继续执行当前case语句之后的case语句
//若case的常量值是一个范围,可以选择去掉break来让某一范围的case判断都为一个结果
//default与case的语句没有强制要求,但通常放最后
break和continue语句
break用于提前终止循环
continue用于跳过本次循坏中continue后面的代码,继续下一次循坏
for、while、do while语句中都有break和connitue语句,而continue语句在for和while语句中有些差异
while语句
while(表达式)
{
语句1;
语句2;
}
//while语句的表达式判断,是只要满足条件,会一直执行,也就是会循坏
//直到不满足表达式的值之后,才会结束循坏
break
while(i<=10)
{
if(i==5)
break;
printf("%d",i);
i++;
}
printf("循坏终止之后");
//当循环变量达到5时,会执行break语句,从而终止当前break语句外的第一层循坏
//继续执行下面的输出语句
continue语句
char b;
while (i<=10)
{
printf("%d",i);
i++;
if (i==5)
continue;
scanf("%c",&b)
}
//当i==5时,会执行continue语句,从而跳过后面的scanf语句
//直接进行循环条件的判断
//但如果循环变量语句的增长,放在continue语句后面
//会造成死循环
for语句
for(表达式1;表达式2;表达式3)
{
语句1;
语句2;
}
//表达式1是用于循环变量的初始化
//表达式2是用于循环结束条件的判断
//表达式3用于循环变量的调整
第一次执行循坏,会先进行表达式1的初始化循坏变量,之后的循坏不会执行表达式1
执行了表达式1后,会进行表达式2的判断,若满足条件,执行语句。之后再进行表达式3的语句,从而调整循环变量。这是一次循坏,接下来,继续进行表达式2的判断,满足继续执行语句,不满足则退出循坏
break语句
与while语句的break语句作用用法相同
continue语句
由于for循坏的循坏变量调整是在for后面写的,所以continue语句在for循坏中不会造成死循环
do while语句
do
语句;
while(表达式);
//while和for循坏都是先判断,满足条件再进入循环,执行循环语句,如果不满足再跳出循环
//但do while是先执行一次循环语句,再进行判断,真就继续执行循坏语句,假就退出循坏
//因此,不管如何,do while语句都至少会执行一次循环语句
break语句和continue语句
与while的break和continue语句基本相同
循环的嵌套
练习
找出100~200之间的素数,并打印在屏幕上。
#include <stdio.h>
#include <stdbool.h>
int main()
{
_Bool sushu = 1;
for (int i = 100; i <= 200; i++)
{
sushu = 1;
int j = 0;
for ( j = 2; j <= (i - 1); j++)
{
if (i % j == 0)
{
sushu = 0;
break;
}
}
if(sushu !=0)
{
printf("%d ", i);
}
}
return 0;
}
这段代码还可以进行优化,
#include <stdio.h>
#include <stdbool.h>
int main()
{
_Bool sushu = 1;
int l=0;
for (int i = 101; i <= 200; i+=2)
{
sushu = 1;
int j = 0;
for ( j = 2; j <= (i - 1); j++)
{
if (i % j == 0)
{
sushu = 0;
break;
}
}
if(sushu !=0)
{
printf("%d ", i);
l++;
}
}
printf("\n%d", l);
return 0;
}
//因为偶数不可能是素数,所以可以直接判断奇数
#include <stdio.h>
#include <stdbool.h>
#include<math.h>
int main()
{
_Bool sushu = 1;
int l = 0;
for (int i = 101; i <= 200; i += 2)
{
sushu = 1;
int j = 0;
for (j = 2; j <= sqrt(i); j++)
{
if (i % j == 0)
{
sushu = 0;
break;
}
}
if (sushu != 0)
{
printf("%d ", i);
l++;
}
}
printf("\n%d", l);
return 0;
}
//除了奇数判断外,还额外添加了根号sqrt
//a=b*c
//例如16=4*4=2*8,必有一个值会小于等于根号16,所以可以用sqrt来判断
goto语句
实现在同一个函数内跳转到设置好的标号处
#include <stdio.h>
int main()
{
printf("llll");
goto flll;
printf("2222");
flll:
printf("3333");
return 0;
}
多用于快速跳出循坏,因为break语句只能跳出一层循坏,用goto语句可以快速跳出去
#include<stdio.h>
int main()
{
for (int i = 1; i < 10; i++)
{
printf("%d ", i);
if (i == 5)
{
goto tiaochuqu;
}
}
printf("2222");
tiaochuqu:
printf("\n1111");
return 0;
}