目录
1.if语句
(1)非0表示真,0表示假;
(2)if与else同时使用表示选择;
(3)当分支中包含多条语句时if和else对应的语句都要加上大括号;
(4)悬空else问题:else总是与最近的if匹配:
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehe\n");
else//此处的else与更近的if(b==2)匹配
printf("haha\n");
//因为此时if...else语句都是嵌套在第一个if语句下的,当a!=1时不会执行语句
//故无输出结果
return 0;
}
2.关系操作符
(1)C语言中用于比较的表达式叫“关系表达式”,里面使用的运算符叫“关系运算符”:
> ⼤于运算符
< ⼩于运算符
>= ⼤于等于运算符
<= ⼩于等于运算符
== 相等运算符 = 赋值运算符(注意区分二者)
!= 不相等运算符
关系表达式通常返回0(假)或1(真);
(2)多个关系运算符不宜连用,若要实现连用则可采用&&或||等操作符来表示;
3.条件操作符
exp1?exp2:exp3
(1)表达式1为真,则表达式2计算,表达式3不算:表达式2的结果是整个表达式的结果;
(2)表达式1为假,则表达式2不算,表达式3计算:表达式3的结果是整个表达式的结果
4.逻辑操作符
(1)基本介绍:
! :逻辑取反运算符(改变单个表达式的真假); 同时还有变量falg可实现效果;
&& :与运算符,就是并且的意思(两侧⾄少有⼀个表达式为假,则为假,否则为真);
|| :或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假);
练习:闰年的判断
//判断规则:
//1.能被4整除且不能被100整除
//2.能被400整除
#include<stdio.h>
int main()
{
int year = 0;
scanf("%d",&year);
if((year%4==0 && year%100!=0) || (year%400==0))
printf("是闰年\n");
return 0;
}
(2)短路求值:
&&:a为0,右边不再计算;
||:a为真,右边不再计算;
5.switch语句
(1)是一种特殊的if...else结构,用于判断有多个结果的情况;根据表达式的不同值执行对应的case分支,找不到对应值则执行default分支;
(2)switch后的表达式必须是整型表达式;
(3)case后的值,必须是整型常量表达式;
char ch="w";
scanf("%c",&ch);//字符是以ASCII码值的形式进行存储的,而ASCII值为整数,字符属于整型家族
switch(ch);//此处无问题
(4)case与后面的数字间必须有空格;
(5)每一个case语句中的代码执行完毕以后,需要加上break才能跳出去;
(6)switch语句中的case语句和default语句是没有顺序要求的,但是通常会将default语句放在最后执行;
6.while循环
//输入一个正的整数,逆序打印它的每一位
//例如:输入1234,输出:4 3 2 1
#include<stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
while(n)
{
printf("%d ", n%10);//利用n%10得到的余数就是n的最低位
n /= 10;//利用n/10去掉最低位,得到倒数第二位
}
return 0;
}
7.for循环
(1)初始化、判断、循环三个部分都可以省略;
(2)省略判断部分表示判断部分恒为真;
for(表达式1;表达式2;表达式3)
//表达式1:循环变量的初始化(只执行一次)
//表达式2:循环结束条件的判断
//表达式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的倍数就可以省去多余的循环和判断
int main()
{
int i = 0;
int sum = 0;
for(i=3; i<=100; i+=3)
{
sum += i;
}
printf("%d\n", sum);
return 0;
}
while和for循环都是先判断,满足循环就进入,不满足就跳出。
8.do while循环
do while循环是直接进入循环,至少执行一次再执行while循环语句;
//输入一个正整数,计算该正整数为几位数
//例如:输入:1234,输出:4
#include<stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
do
{
count++;
n=n/10;
}while(n);
printf("%d\n", count);
return 0;
}
//此题非常适用于do while循环,因为哪怕数字0也是一位数,要进行位数的统计
9.continue和break
(1)break:用于永久地终止循环,一旦执行,直接跳出循环,继续往后执行;
(2)continue:跳过本次循环continue之后的代码:
1>while循环中:
#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;
}
//变式:改变i+1的位置
int main()
{
int i = 1;
i = i+1;
//打印结果:i从2开始,到11结束
while(i<=10)
{
if(i == 5)
continue;
printf("%d ", i);
}
return 0;
}
2>for循环中:跳过continue后面的代码,直接来到for循环的调整部分
#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;
}
3>do while中:和while循环中的类似
#include <stdio.h>
int main()
{
int i = 1;
do
{
if(i == 5)
continue;
//当i=5时碰到continue跳过后面这一节到while处执行语句
//i=5满足i<=10故返回至do--if语句,最后发生死循环
printf("%d ", i);
i = i + 1;
}while(i<=10);
return 0;
}
10.循环的嵌套
//找出100~200之间的素数,并打印在屏幕上
//素数又称质数,只能被1和本⾝整除的数字
#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;//此时出现了能将i整除的数
break;//跳出循环
}
}
if(flag == 1)//循环结束时未出现能将i整除的数,说明i为素数;故flag未改变
printf("%d ", i);
}
return 0;
}
//优化1:
#include <stdio.h>
int main()
{
int i = 0;
int count = 0;
for(i=101; i<=200; i+=2)//偶数绝不为素数(可被2整除);故此时的优化产生均为奇数
{
int j = 0;
int flag = 1;
for(j=2; j<i; j++)
{
if(i % j == 0)
{
flag = 0;
break;
}
}
if(flag == 1)
{
printf("%d ", i);
count++;
}
}
printf("\n count= %d\n", count);
return 0;
}
//优化2:大大减少了试除的次数
#include <stdio.h>
#include<math.h>//sqrt函数的头文件
int main()
{
int i = 0;
int count = 0;
for(i=101; i<=200; i+=2)
{
int j = 0;
int flag = 1;
//n=a*b,则a与b至少有一个<=(n)^2
//例如:16=2*8=4*4,至少一个因子<=(16)^2=4
for(j=2; j<=sqrt(i); j++)
{
if(i % j == 0)
{
flag = 0;
break;
}
}
if(flag == 1)
{
printf("%d ", i);
count++;
}
}
printf("\n count= %d\n", count);
return 0;
}
11.goto语句
goto语句可以在同一个函数内跳转到设置好的标号处:
#include <stdio.h>
int main()
{
printf("hehe\n");
goto next://执行到此处就跳到"next"处,造成死循环
printf("haha\n");
next:
printf("跳过了haha的打印\n");
return 0;
}
练习:
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
for(i=0; i<5; i++)
{
for(j=0; j<5; j++)
{
printf("hehe\n");//此时输出结果为25个hehe
}
}
return 0;
}
//变式:将i=0、j=0都忽略:
int main()
{
int i = 0;
int j = 0;
for(; i<5; i++)
{
for(; j<5; j++)
{
printf("hehe\n");//此时输出结果为5个hehe
//原因:循环至i=1时,进入j循环时由于j未被重新初始化,保留值j=5,导致后续无法再进入j循环
}
}
return 0;
}