c语言中的运算:
四则运算:+-*/%()
赋值运算:=、+=、-=、*=、/=、%=、>>=、<<=、&=、|=、^=、++、--
关系运算:==、!=、>、>=、<、<=
逻辑运算:!、&&、||
关系运算
---关系运算符也被称为关系操作符、比较运算符等。
c语言提供了六个关系运算符:
- == 相等 // c语言中"="是赋值运算符,“==”是相等运算符。
- != 不相等
- > 大于
- >= 大于等于
- < 小于
- <= 小于等于
关系运算符的结果是一个逻辑值,逻辑值只有两种可能的值:true(真,表示成立)或false(假,表示不成立)。c语言规定1为true,0为false 逻辑值也被称为逻辑量。
printf("%d",2>3); //判断为false,值为false,打印结果为0.
printf("%d",2<3); //判断为true,值为true,打印结果为1
计算机中连续的关系运算是从左到右依次进行的。这与数学中的比较还是有很大区别的。
6>5>4 //6>5先进行运算,得到1,然后1>4进行运算,值为0.所以判断为假。
a==b==6 //a==b先进行运算,得到结果可能是0,也可能是1.然后判断是否与6相等。结果肯定为假。
优先级:
==、!=的优先级比其他的优先级更低
5>3==6>4 //5>3优先运算,结果为1,6>4随后运算,结果也为1,最后运算1==1,值为true。可以理解为5>3是否等于6>4.
关系运算符比算术运算符的优先级更低,但比赋值运算的优先级高。
a=1==1+2<=2 //1+2优先运算,值为3,随后3<=2运算值为false,为0,最后运算1==0,值为false,为0。最终将0赋值给a。
逻辑运算
---逻辑运算是针对逻辑量进行的运算,结果只有0或者1。
逻辑量(逻辑值)是关系运算或者逻辑运算的结果。是真与假,是true与false,是1与0。
逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式
- !:非 //逻辑值取反运算(改变逻辑值的真或假,若逻辑值为true,则逻辑运算为false,若逻辑值为false,则逻辑运算后为true。)
- &&:与 //两侧逻辑值都为true,则逻辑运算结果为true。否则为false。
- ||:或 //两侧逻辑值至少有一个为true时,运算结果为true。否则为false。
判断5月、6月、7月、8月是雨季,判断12月、1月、2月、3月是旱季。
int month=0;
scanf("%d",&month);
if(month>=5 && month<=8)
printf("是雨季");
if(month==12 || month>=1 && month<=3)
printf("是旱季");
优先级:
!优先级高于&&,&&高于||。
逻辑运算符普遍低于关系运算符。
优先级额外规定:单目运算符优先级高于双目运算符。!是单目运算符
算子又称为操作数,操作目,操作值,运算数(笔记2内容)
四则运算与关系运算等运算符都有两个算子,被称为双目操作符。
+-在四则运算中是双目操作符,但它们还可以表示正负号,在表示正负号时是单目操作符。逻辑!只有一个操作数是单目操作符。++、--也是单目操作符。
短路
---逻辑运算是从左向右进行的,如果左边的结果已经能够决定结果了,就不会做右边的计算。
a==6&&b+=1; //根据逻辑运算符有短路的特点。所以当a==6不成立时,b+=1根本不会运算,只有a==6成立时,b才能被正确赋值。所以为了避免错误,不要在逻辑运算内进行赋值运算。
int i = 0 , a = 0 , b = 2 , c = 3 ;
i = a++ && ++b && c++; //提示:逻辑运算值为0或者1,后置++只有语句结束后才会+1。
printf("i=%d\n a=%d\n b=%d\n c=%d\n",i,a,b,c);
条件运算
?:条件运算符又被称为三目运算符或者叫三元运算符。
a=(a>3) ? a-2 : a+5; //?前面的是条件,后面的是条件满足时的值,:后面是条件不满足时的值。相当于if语句
if(a>3)
a=a-2;
else
a=a+5;
优先级
条件运算符的优先级高于赋值运算符,但低于其他运算符。
运算顺序是从右往左计算。
a=3*b>5?5:10 // a*b>5如果成立,则a=5,如果不成立,则a=10.
a<b ? c : d+2 // a<b如果成立,则结果为c,如果不成立,则d+2.
优点是书写更简洁,缺点是增加了嵌套的表达式会非常复杂并不利于阅读。
例如:a=(a>10)?(a<20)?a-2:a-5:(a<5)?a+2:a+5; //请大家分析一下步骤。
逗号运算符
逗号用来连接两个表达式,并以右边表达式的值作为它的结果。
int a,b,c;
a=(b=2,c=3,b+c);
printf("a=%d,b="%d,c=%d\n",a,b,c);
优先级:
逗号的优先级是所有运算符中最低的,所以它两边的表达式会先计算。
int a;
a = 1 + 2, 2 + 3; //逗号优先级低于赋值运算符,所以a的值是3.
printf("%d",a);
逗号运算是从左往右进行的,所以左边的表达式会先计算,而右边的表达式的值会保留下来作为逗号运算的结果。
int a;
a = (1 + 2, 2 + 3); //逗号右边的值为逗号运算的结果。所以a的值是5.
printf("%d",a);
逗号运算符的应用。
逗号运算符常常用于把多个表达式连接成一个更大的表达式。
表达式1,表达式2,表达式3....表达式n
在赋值时使用
a=2,b=3,c=4;
for循环中使用
for(a=0,b=5;a<b;a++,b--).....
()运算符
()运算符应用多样可分为一下几类:
类型转换:括号可用于执行强制类型转换,也就是将一个数据类型转换为另一种数据类型。其语法是在括号内指定目标数据类型,然后紧跟要转换的表达式。
函数调用运算符:当 ()
紧跟在函数名之后时,它是函数调用运算符,其作用是调用函数并传递参数。在调用时,函数名后的 ()
内可以包含多个用逗号分隔的参数,这些参数会被传递给函数用于计算。
表达式分组运算符:用于改变表达式中运算符的优先级,让括号内的表达式优先计算。
优先级
括号运算符在各种运算中的优先级是最高的。这表示括号内的被优先计算。
当表达式中多个()
连续出现时,会从左向右依次计算。
语句
c语言的代码是由一条一条的语句构成的,c语言的语句可以分一下五大类。
- 空语句
- 表达式语句
- 函数调用语句
- 复合语句
- 控制语句
空语句
---一个分号就是一条语句,这就是空语句。在for语句的判断表达式中常出现空语句。
int main()
{
; //空语句
return 0;
}
控制语句
判断语句
条件判断语句也叫分支语句:if语句、switch语句;
if语句
---根据比较的结果,决定做、还是不做某些动作,就要用到if语句。
---表达式成立(为真),则语句执行,表达式不成立(为假),则语句执行。
一个基本的if语句有一个关键字if开头,后面跟上在括号里的一个表达条件的逻辑表达式,然后是一对大括号“{}”之间的若干条语句。如果表示条件的逻辑表达式的结果为true,那么就执行后面跟着的这对大括号中的语句,否则就跳过这些语句不执行,而继续下面的其他语句。
if(表达式) //此处没有分号,这不是if语句结束的地方。
语句; //if内只有一条执行语句时,可以不用大括号,因为分号可以表示if语句的结束。整个if语句原本写为 if(表达式) 语句 ;
当if语句内有多条语句时需要加上{}。
if(表达式){
语句1;
语句2;
}
if.....else....
输入一个整数,判断是奇数或偶数。
int main()
{
int num=0;
scanf("%d",&num);
if(num%2 != 0) //奇数是不能被 2 整除的整数(被2整除的数为偶数)
printf(“%d是奇数”,num);
else //当if语句判断输入的值不是奇数,那么就可以else其数值为偶数。
printf("%d是偶数",num);
return 0;
}
if和else后用{}的好处
- 明确所执行代码块的范围
- 提高代码块的可维护性与可读性
- 避免逻辑错误减少bug产生。
- 提高代码的健壮性与一致性
嵌套if语句
---在if else 语句中,else可以与另一个if语句连用,构成多重判断。当if的条件满足或者不满足的时候要执行的语句也可以是一条if或者if-else语句,这就是嵌套的if语句。
输入一个整数,判断输入的整数是0,还是正数或者负数。
int main()
{
int num = 0;
scanf("%d",&num);
if(num == 0)
printf("数值是0");
else if(num > 0) //在else中嵌套了if
printf("数值是正数");
else
printf("数值是负数");
return 0;
}
级联的if-else,是if多重嵌套的一种书写方式。
输入一个人的年龄,如果年龄小于18岁,打印“少年”
如果年龄在18至44岁,打印“青年”
如果年龄在45至59岁,打印“中老年”
如果年龄在60至89岁,打印“老年”
如果年龄在90岁以上,打印“老寿星”
正常写法:
int main()
{
int age = 0;
scanf("%d",&age);
if(age<18) //或者写if(age>0 && age<18) 使用与运算符来圈定范围
printf("少年\n");
else
{
if (age<45)
printf("青年\n");
else
{
if (age<60)
printf("中老年\n");
else
{
if (age<90)
printf("老年\n");
else
printf("老寿星\n");
}
}
}
return 0;
}
级联的if else写法
int main()
{
int age = 0;
scanf("%d",&age);
if(age<18)
printf("少年\n");
else if (age<45)
printf("青年");
else if (age<60)
printf("中老年");
else if (age<90)
printf("老年");
else
printf("老寿星");
return 0;
}
增加了嵌套的条件运算符虽然简短但非常不利于阅读与理解,所以不推荐使用嵌套的条件运算。一段好的代码一定是通俗易懂的代码。
例如:age<18?printf("少年"):age<45?printf("青年"):age<60?printf("中老年"):age<90?printf("老年"):printf("老寿星");
switch语句
除了if语句外,c语言还提供了switch语句来实现分支结构。
switch语句是一种特殊的if-else结果,用用于判断条件有多个结果的情况。
书写格式
switch(控制表达式){ //必须是整型表达式。用于控制程序从哪个case开始执行。
case 常量1: //case后的值必须是常量或者是常量表达式,例1、2、2+5、或定义的常量。
语句; //每个case语句中的代码执行完成会继续执行下一个case内的代码。
case 常量2: //整型包括字符,字符的本质是ASCII码值,这个值是整数
语句;
break; //当case语句中的代码有break关键字时,程序执行到这会跳出switch语句。
default: //case与default语句没有顺序要求。当没有任何case满足条件时,那么走default语句。
语句; //当default语句不在最后时,要根据实际情况考虑是否添加break。
}
整型表达式:是指其运算结果为整型数据类型的表达式。在表达式里可以包含整型常量、整型变量、算术运算符、关系运算符、逻辑运算符等,只要最终的计算结果是整型即可
整型常量表达式:是指在编译时就能确定其值的整型表达式。它只能包含整型常量、枚举常量、字符常量以及一些编译时就能确定结果的运算符(如算术运算符、逻辑运算符等),不能包含变量,因为变量的值在运行时才会确定。
switch语句的执行流程:
根据控制表达式的结果来确定从哪个case开始执行程序。若确定case2后,会从case2开始,按顺序执行case2、case3、case4,直到break结束,如果没有break则执行完最后一条case或者default语句结束。
当没有任何case满足条件时,那么走default语句。
输入1~7的数字,打印对应的星期
int day =0;
scanf("%d",&day);
switch(day)
{
case 1:
printf("星期一");
break;
case 2:
printf("星期二");
break;
case 3:
printf("星期三");
break;
case 4:
printf("星期四");
break;
case 5:
printf("星期五");
break;
case 6:
printf("星期六");
break;
case 7:
printf("星期日");
break;
default:
printf("输入错误,请输入1~7的值。");
break;
}
输入1~7的数字,打印对应的工作日与休息日
switch(day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日");
break;
case 6:
case 7:
printf("休息日");
break;
default:
printf("输入错误,请输入1~7的值。");
break;
}
循环语句
do while语句、while语句、for语句
while循环
while英文可以翻译为当....的时候。在c语言中while循环的意思可以理解为:当条件满足时,不断地重复循环体的语句。
循环执行之前判断是否继续循环,所以有可能循环一次也没有被执行。
while循环的书写格式
while(表达式) //此处没有分号,因为这不是while循环的结束。
{ //循环体有多条语句时,必须用{ }括起来。
循环体; //循环体只有一条语句可以不用{ },用分号表示循环体的结束。
} //循环体用{ }括起来,方便阅读,减少出错
打印1~10的值
int a=1;
while(a<=10) //循环终止条件a不能大于10.
pintf("%d\n",a++); //a++使得a的值最终会达到循环的终止条件。
输入一个正整数,逆序打印整数的每一位,如:输入1234,输出4 3 2 1
int a=1234;
scanf("%d\n",&a);
while(a)
{
printf("%d ",a%10);
a=a/10; //两个整数相除得到的还是整数。
}
do while循环
do while循环在初次进入循环的时候,先执行一轮循环体代码之后,再来检查循环条件是否满足,如果满足则继续下一轮循环,不满足则结束循环。
do
{
循环体; //循环体至少被执行一次
}
while(循环条件); //此处注意要有分号。
输入一个正整数,计算这个整数是几位数? 例如:输入43210 输出5.
int main() {
int a = 43210;
int count = 0;
do
count++;
while (a = a / 10); //可以将赋值作为表达式的判定条件,将a/10赋值给a,再判断a是否为零。
printf("%d", count);
return 0;
}
for循环
for循环像一个计数循环:设定一个计数器,初始化它,然后在计数器到达某值之前,重复执行循环体,而每执行一轮循环,计数器值以一定步进进行调整,比如加1或者减1.
for(表达式1;表达式2;表达式3) //表达式之间是分号隔开的。
{
循环体; //如果只有一条语句可以不用{ },但推荐都使用{ }。
}
表达式1:循环变量初始动作(如果变量已经初始化可以写为空语句)
表达式2:循环是否满足的判断条件
表达式3:循环变量的调整 //与while循环相比,for循环将为结束循环的表达式从循环体中提出到此
for循环的执行顺序:先执行表达式1与2,满足条件进入循环体,循环体结束执行表达式3,然后跳过表达式1,直接进行表达式2进行判断,满足条件进入循环体,循环体结束执行表达式3然后再判断,直到条件判断不满足跳出循环。
for循环中的每一个表达式都是可以省略的
for(;条件;)==while(条件)
计算1~100之间3的倍数的数字之和
int sum = 0;
for(int a = 1 ;a<=100; a++)//产生1~100的数。c99以上编译器可以在for内初始化变量。
if(a%3==0) //判断哪些数是3的倍数
sum += a ; //此处分号作为if语句的结束也作为for循环的结束。正规格式要加{ }
printf(“%d”,sum);
也可以将for表达式写为:
for(int a=3;a<=100;a+=3)//直接产生100以内3的倍数的数。循环体内就不需要判断3的倍数了
sum+=a;
printf(“%d”,sum);
//这样的算法比上一种算法循环次数更少,而且不需要进行判断,更节省资源。
转向语句
break语句、continue语句、goto语句、return语句
break和continue语句
在循环执行的过程中,常常需要提前终止循环。在这种情况系啊,c语言提供了break和continue两个关键字,用于循环中。
当某件事发生后就禁止循环就用break
当某件事发生后就跳过这件事后面的语句就用continue
break语句
只要break语句被执行就会永久终止循环,结束循环语句,跳出循环语句。
while循环遇到break。
int a =0;
while(a<=10)
{
if(a==5)
break; //如果a是5的时候break(提前结束了循环)
a++;
printf("%d ",a);
}
for循环遇到break。
for(int a = 0;a<=10;a++) //a<=10为运行循环的条件。那么a>10就是结束条件
{
if(a==5)
break; //如果a是5时break(结束循环),a==5成为结束循环的判断条件。
printf("%d ",a);
}
continue语句
只要执行continue就会跳过本次循环中continue后边的代码,在for循环和while循环中有所差异。while循环中有可能跳过循环的调整部分造成死循环,而for循环不会。
while循环中的continue:
int a =0;
while(a<=10)
{
if(a==5)
continue; //如果a是5时且仅当a是5时跳过了后面的代码。重新进入循环判断。
a++; //当a是5时,a++被跳过,程序陷入死循环。需要将a++提到if语句上才行。
printf("%d ",a);
}
for循环中的continue:
int a = 0;
for(a=0;a<10;a++) //for循环中continu不会出现跳过a++的条件变量调整的情况。
{
if(a==5)
{ continue;} //当a是5时且仅当a是5时,continue语句跳过后面的语句直接返回for的调整
printf("%d ",a);
}
goto语句
---在多重循环嵌套时,特别适合用goto语句跳出循环。goto语句可以实现在同一个函数内跳转到设置好的标号处。
printf("周一");
goto next; //next就是自己设置的标号,设置标号后用分号。名字不能是关键字。
printf("周二");
next: //跳转的标号后使用冒号。跳过了周二,从周三继续打印。
printf("周三");
end: //goto从周四后面又跳了回来,陷入了死循环。
printf("周四");
goto end; //end是自己设置的标号名。
printf("周五");
return语句
----主要用于从函数里返回一个值,同时终止函数的执行。
一个函数里可以有多个return
语句,但只要有一个return
语句被执行,函数就会立即结束。
return
语句返回的值的类型必须和函数定义时的返回类型一致,不然会产生编译错误或者未定义行为。
循环的嵌套
在解决实际问题中,while、do while、 for三种循环常常嵌套在一起使用。
找出100~200之间的素数,并打印在屏幕上。(素数有称为质数,只能被1和自身整除的数)
for (int a = 100; a <= 200; a++) //产出100~200间的数 第一层循环
{
int b = 1; //假设a是素数时b为1
for (int c = 2; c < a; c++) //产出2~(a-1)之间的数 第二层循环
{
if (a % c == 0) //100~200间的数试除2~(a-1)之间的数。
{
b = 0; //如果整除说明不是素数,所以将b设为0然后跳出当前循环。
break; //break也可以使用goto语句跳转到最外层循环
}
}
if (b) //如果b未被设为0则打印a到屏幕上。
printf("%d ", a);
}
优化算法:
#include <math.h> //sqrt()是库函数,开平方。包含在math.h的头文件中
for (int a = 101; a <= 200; a+=2) //减少了循环次数,偶数除了2都不是素数。
{
int b = 1;
for (int c = 3; c < =sqrt(a); c+=2) //1.奇数除以偶数的结果必然不是整数,所以没有必要检查偶数。2.因为a如果被整除,肯定有一个因子小于等于a的开平方。这样也可以减少循环次数。
{
if (a % c == 0)
{
b = 0;
goto end; //可以使用goto跳出循环,但只是跳出一层循环完全没必要用goto。
}
}
end:
if (b)
printf("%d ", a);
}