修改时间为2022年11月15日
今天继续介绍操作符的内容。还有上节忘记附上有关操作符优先级的表,在本章末尾会补上。
一.关系操作符
== 、!= 、> 、>= 、< 、<=
==操作符用于测试相等,!=操作符用于测试不相等。后面4个操作符与数学中符号的作用类似。
作用
这些操作符的结果都是整形,如果操作符两端的操作数符合他们之间的关系,那结果就为真,返回1;如果不符合操作符指定的关系,那就为假,返回0。
因此通常关系操作符的结果可以赋给整形变量,但经常用于if(选择语句)和while(循环语句)中作为测试表达式。
注意
- =是赋值操作符,==是关系操作符(相当于数学上的等号=)
- 语句的类型和作用后面会讲
二.逻辑操作符
&&(逻辑与)、||(逻辑或)
这个可以简单理解为并且、或者,类似与离散数学中的合取、析取
作用
它们用于对表达式进行求值,测试它们的真假,&&两端操作数全真才为真,||两端操作数有真便是真,下面会讲到它们的详细用法
多说无益,举个粒子
这个if语句表示为如果year能被4整除并且能被100整除,那么就把year打印出来。
这个if括号内的测试表达式表示如果year能被4整除并且不能被100整除就打印year,或者year能被400整除就打印year。
注意
不知道了解过操作符优先级的朋友注意到没有,%等操作符的优先级要高于&&和||的优先级,按原理来讲应该先执行%等操作,再进行&&和||操作,可惜不是。
这是因为&&和||操作符会控制子表达式的求值顺序,也是会控制表达式的求值顺序的四个操作符之二,即从左到右,左边表达式总是先求值,这也导致一个很有趣的现象短路求值。
短路求值,实际很简单。&&操作符的左操作数如果为假,那么即使右边的操作数为真,整个表达式也是为假,所以干脆右边表达式就不计算,反正没意义。
同理,||操作符的左操作数如果为真,那么无论右操作数为真还是为假,整个表达式都为真,那么计算右边表达式就无意义了,所以右边表达式也不计算。
举个离子
在这两个if语句的测试表达式中都是只执行&&和||的第一个子表达式,后面的表达式没执行,这就是短路求值
360笔试题
#include <stdio.h>
int main()
{
int i = 0,a=0,b=2,c =3,d=4;
i = a++ && ++b && d++;
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
return 0;
}
//程序输出的结果是什么
结果是1 2 3 4。
为什么?
a先使用,再++,所以a为0,为假,a++ && ++b整个表达式为假,不对b进行++操作。因为a++ && ++b为假,表达式的值为0,0&&d++也为假,d也不进行++操作。
现在将&&操作符改为||,将a改为1。
#include <stdio.h>
int main()
{
int i = 0,a=1,b=2,c =3,d=4;
i = a++||++b||d++;
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
return 0;
}
//程序输出的结果是什么
结果为2 2 3 4。
为什么?
a先为1,后++,因为a为真,a++||++b为真,不对b进行++操作。因为a++||++b为真,表达式的值为1,1||d++也为真,同样不对d进行++操作。
条件操作符
expression1?expression2:expression3
它是三目操作符,有三个操作数
用法
首先判断expression1的值,如果它的值为真,就返回expression2的结果,整个条件语句的值就是expression2的值;如果它的值为假,就返回expression3的结果,整个条件语句的值就是expression3的值
作用
它的作用和if语句类似,都包含判断的表达式
举个简单的例子
可以解读为,如果a>b,就返回b的值;如果a<b,就返回b的值。
注意
它也是今天要介绍的最后一个可以控制表达式求值顺序的操作符,无论表达式的优先级有多大,它都是从expression1执行。
逗号表达式
expression1,expression2,…,expressionN
用法
这些表达式从左到右进行计算,最后返回最后一个表达式的值。
expression1的值为10,expression2的值为12,到expression3时,a已完成++,c已完成–,所以a=11,c=11,a+c就等于22。
逗号表达式运用得当,可以使代码更加简便
这里num = get_num(n)出现两次,可以用逗号表达式改写为
如果其中一句语句要修改,你就可以到测试表达式的地方进行修改,不用费心去找相同的语句修改。
下标引用,函数调用,结构成员
这一部分只是简单认识,后面会详细讲到
- [ ] 下标引用操作符一般出现在数组
int arr[10] = {0};//这里创建一个数组,[]内是数组的元素个数,int是数组每个元素的类型
//但[]不是下标引用
printf("%d",arr[0]);//这个才是下标引用,表示数组中下标为0的元素
//C语言中数组中每个元素对应一个下标,下标总是从0开始,往后每个元素
//依次加一,在本例中,数组的最后一个元素的下标为9
- ()函数调用操作符
函数调用操作符有一个或多个操作数,它的第一个操作数就是函数名,其余操作数是传递给函数的参数。
int main()
{
int x = 1;
int y = 2;
Add(x,y);//Add是函数名,x和y是参数
return 0;
}
- ->和 . 操作符用来访问结构体成员
生活中一些对象不能简单地使用C语言的内置类型(int,char,float,double等)来描述,比如描述一个人,不能简单地使用内置类型来表示,所以就有了结构体类型,它将一些类型聚合在一起。
例子
struct Student s//struct Student是我们创建的类型,s是我们在这个类型上创建的变量
{
char name[20];//这些都是成员名
int age;
char sex[10];
}
int main()
{
struct Student s = {“木南”,18,“男”};//结构体的初始化
printf("%s %d %s",s.name,s.age,s.sex);//这就是结构体成员访问操作符
//结构体变量.成员名
struct Student*ps = &s;
printf("%s %d %s",(*p).name,(*p).age,(*p).sex);
printf("%s %d %s",p->name,p->age,p->sex);//这也是结构体成员访问操作符
//结构体指针->成员名
}
如果有一个结构体变量s,那么s.a就是访问结构体中a成员,如果有一个结构体指针,那么访问它的成员就得用->。
附表
完结
操作符就讲完了,如果还有不懂请在评论区留言,我一定会尽己所能帮助大家;如果我有哪些错误,请一定帮忙指出,我会认真改正。感谢!