3.1 运算符分类
c语言提供了13种类型的运算符,如下所示:
(1)算术运算符(+ - * / %)
(2)关系运算符(> < == >= <= !=)
(3)逻辑运算符(!&& ||)
(4)位运算符(<< >> ~ | ^ &)
(5)赋值运算符(=及其扩展赋值运算符)
(6)条件运算符(?:)
(7)逗号运算符(,)
(8)指针运算符(*和&)(指针时用到)
(9)求字节运算符(sizeof)
(10)强制类型转换运算符((类型))
(11)分量运算符(.->)(结构体时用到)
(12)下标运算符([])(数组时用到)
(13)其他(如函数调用运算符())
3.2 算术运算符及其算术表达式
注意点:
- 当操作符/的两个操作数都是整型数时,执行整除运算,其他情况下执行浮点型数除法。
- %为取模运算符,它接收两个整型操作数,将左操作数除以右操作数,返回值为余数。
- 由算术运算符组成的式子称为算术表达式,表达式一定有一个值。
【算数运算符代码实例】
#include <stdio.h>int main() {//5*2=10 6/3=2 11%4=3//4+10-2+3=15int result = 4+5*2-6/3+11%4;printf("result=%d\n",result);//15return 0; }
3.3 关系运算符与关系表达式
注意:
- 关系表达式的值只有真和假,对应为1真0假。
- 由于c语言中没有布尔类型,所以在c语言中0值代表假,非0值即为真。
- 关系运算符优先级低于算数运算符。
- 判断整型变量i是否等于3时,可以写成3==i;即把常量写在前面而把变量写在后面
- 如果判断三个数是否相等,绝对不能写成if(5==5==5),这样无论何时都为假,因为首先5==5得到结果为1,然后1==5得到结果为0,若判断a,b,c是否相等,应写成a==b && b==c
【关系运算符使用】
#include <stdio.h>//关系运算符,优先级小于算术运算符 int main() {int a;//使用while循环方便一直测试//只要while循环中为真就会一直进入循环//scanf匹配成功的时候返回值为1,使while循环为真while(scanf("%d",&a)){if(3<a && a<10){ //若写成(3<a<10)将一直循环下去,错误写法printf("a between 3 and 10\n");}else{printf("a is not between 3 and 10\n");}}return 0; }
【运行效果截图】
【小结】
若是写成(3<a<10)在数学上是正确,但在程序中是错误的。
首先,3<a结果只有1或0两种,由于1和0都小于10,所以无论a值为多少,表达式始终为真。
因此在判断变量a是否大于3且同时小于10时,要写成 a>3 && a<10
3.4 逻辑运算符与逻辑表达式
注意:
- 逻辑非! 的优先级高于算术运算符
- 逻辑与&& 与 逻辑或|| 的优先级低于关系运算符
- 逻辑表达式的值只有真和假,对应为1和0
【逻辑运算符使用】
#include <stdio.h>//逻辑与&& 和 逻辑或|| 例子 logic 判断闰年 int main() {int year, i, j=1;//因需重复测试,所以用while循环while (scanf("%d", &year)) {if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {//是闰年printf("%d is leap year\n", year);} else {//不是闰年printf("%d is not leap year\n", year);}}//逻辑非!例子i = !!j; //自右至左,即先计算!j,再计算!(!j)printf("i value=%d\n", i); //1return 0; }
【运行效果截图】
【逻辑与 和 逻辑或 短路运算案例】
#include <stdio.h>//逻辑与&& 和 逻辑或|| 的短路运算 int main() {int i = 0;//当i为真时输出后面的printf,当i为假时不输出//当i为假时不会执行逻辑与后的表达式,称为短路运算i && printf("Hello, World!\n");//i && printf("Hello, World!\n");等价于下面的if语句if(i){printf("Hello, World!\n");}//逻辑或|| 的短路运算,当i为真时不会执行后面的表达式i = 1;i|| printf("Hello, World!\n");return 0; }
【运行效果截图】
【小结】
- 逻辑与短路运算:当前一个表达式为假时,后面的表达式不会得到执行
- 逻辑或短路运算:当前一个表达式为真时,后面的表达式不会得到执行
3.5 赋值运算符
注意:
- 左值:放在赋值运算符左边的,为左操作数,只有变量可以成为左值
【例】
a = b + 25;
- 右值:放在赋值运算符右边的东西
【错误演示】
#include <stdio.h>int main() {int a = 1,b = 2;//错误演示b + 25 = a;return 0; }
【报错】
error: lvalue required as left operand of assignment
复合赋值运算符
是一种缩写形式,可以对变量的赋值操作变得更加简洁
【例】
iNum = iNum + 5; //对变量iNum进行赋值操作,值为变量本身与一个整型常量5相加的结果
【使用复合语句】
iNum += 5;
【加后赋值与乘后赋值的用法】
#include <stdio.h>int main() {int iNum, iResult;iNum = 10;iResult = 3;iNum += 5; //等价于 iNum = iNum + 5 = 10+5=15iResult *= iNum; //等价于 iResult = iResult * iNum = 3*15=45printf("iNum=%d\n", iNum); //15printf("iResult=%d\n", iResult); //45 }
【运行结果】
3.6 求字节运算符sizeof
注意:
- sizeof不是函数
- sizeof用于求常量或变量所占空间的大小
- sizeof结果的单位是 字节
【求字节运算符例子】
#include <stdio.h>//sizeof运算符(求字节运算符) int main() {int i = 0;printf("i size is %d\n", sizeof(i));//4return 0; }
【运行结果】
【小结】
运行结果为i size is 4,可以得知整型变量所占空间大小是4字节
3.7 课时作业
- 课时3作业1
描述:判断某个年份是不是闰年,如果是闰年,输出“yes”,否则输出“no”
输入:输入一行,只有一个整数x(0<=x<=10000)
输出:只有一行字符
闰年的判断:可以被4整除同时不能被100整除,或者可以被400整除
【课时3作业1代码】
#include <stdio.h>//课时3作业1 //判断某个年份是不是闰年,如果是闰年,输出“yes”,否则输出“no” //输入:输入一行,只有一个整数x(0<=x<=10000) //输出:只有一行字符 //闰年的判断:可以被4整除同时不能被100整除,或者可以被400整除 int main() {int year;scanf("%d",&year);if(year%4==0&&year%100!=0||year%400==0){printf("yes\n");}else{printf("no\n");}return 0; }
【运行结果】
- 课时3作业2
描述:读取一个整型数,字符,浮点数,分别到变量i,j,k中,然后将i,j,k直接相加并输出,小数点后保留两位小数,不用考虑输入的浮点数的小数部分超过了两位。
输入:一个整形数,字符,浮点数
输出:i,j,k三个变量的求和值
【课时3作业2代码】
#include <stdio.h>//课时3作业2 //读取一个整型数,字符,浮点数,分别到变量i,j,k中,然后将i,j,k直接相加 // 并输出,小数点后保留两位小数,不用考虑输入的浮点数的小数部分超过了两位 //输入:一个整形数,字符,浮点数 //输出:i,j,k三个变量的求和值 int main() {int i;char j;float k;scanf("%d %c%f",&i,&j,&k);printf("%0.2f\n",i+j+k);return 0; }//%0.2f 不限制浮点数输出的整体长度 %5.2f也行:即小数点前的数字无规定
【运行结果】
【小结】
输出时要控制格式,混合输入中每次在%c之前需要加一个空格
整型数、字符、浮点数可以直接相加运算
同时输入3个数的读取顺序
3.8 c语言运算符优先级表
说明:
- 同一优先级运算符,运算次序由结合方向所决定
- 优先级简记: ! > 算术运算符 > 关系运算符 > && > || > 赋值运算符