前面两篇文章介绍了不少运算符,但关于运算符还是有一些值得我们注意的知识点没讲到,所以,我们在这篇文章中再加以补充,希望能使大家对于运算符的认识更加全面。
目录
1.2.4^逻辑异或:两个运算对象相同为False,相异为True(只关注两个运算对象逻辑值的异同,不关注逻辑值具体为False或True。
1.逻辑运算符
1.1逻辑运算符的种类
逻辑运算符有:&、|、&&、||、!、^ 。C语言一共提供了6种逻辑运算符,逻辑运算符的运算结果使逻辑值,即只有逻辑真和逻辑假两个值。
1.2逻辑运算符的使用说明
1.2.1& 和 &&
相同点:
这两个逻辑运算符都表示:“与”,只要两个运算对象中有一个为False,则全为False。
不同点:
&(与):表达式a & 表达式b 在运算时,表达式a和b都会先被执行,再进行True和False的判断。
&&(短路与):表达式a && 表达式b 在运算时,如果表达式a(先被执行的)结果为False,则表达式b不进行运算,直接返回结果,计算效率高。(表达式中有部分可能压根不被执行,所以称为短路与)
1.2.2| 和 ||
相同点:
这两个逻辑运算符都表示:“或”,只要两个运算对象中有一个为True,则全为True。
不同点:
|(或):表达式a | 表达式b 在运算时,表达式a和b都先会被执行,再进行True和False的判断。
||(短路或):表达式a || 表达式b 在运算时,如果表达式a(先被执行的)结果为True,则表达式b不进行运算,直接返回结果,计算效率高。(表达式中有部分可能压根不被执行,所以称为短路或)
1.2.3!
逻辑非:取相反结果,即若运算对象原来为逻辑真变成逻辑假,原来为逻辑假变成逻辑真。
1.2.4^
逻辑异或:两个运算对象相同为False,相异为True(只关注两个运算对象逻辑值的异同,不关注逻辑值具体为False或True。
注意:
①逻辑运算符(&&、||、!)的运算对象可以是数据类型为整型、实型和字符型的常量,变量或者合法的表达式。
数值为0即是逻辑假,为其他值均为逻辑真。
②可能有小伙伴会疑惑逻辑运算符怎么和位运算符有重叠的部分呢?其实,它们只是同一个符号,但具体的功能是不同的。
位运算符【&、|、^】区别的方式:
逻辑运算符:左右连接的是布尔类型的运算对象,即运算对象是的值是逻辑真和逻辑假
位运算符:左右连接的是具体的数值,特别注意位运算符的运算对象是整数
2.下标访问[ ]、函数调⽤()
2.1[ ] 下标引⽤运算符
运算对象:一个数组名和一个索引值
int arr[10];//创建数组
arr[9] = 10;//实⽤下标引⽤操作符。
//[ ]的两个运算对象是arr和9。
[ ] 下标引⽤运算符的使用是基于数组的基础上,所以我们在使用前是需要建立一个数组。不过,客观实际上来说,并不是数组服务于[ ] 下标引⽤运算符,而是[ ] 下标引⽤运算符就是为了方便使用数组而出现的。所以,大家可不要为了使用这个运算符而使用。
特别注意:索引值不要超过数组的大小,不然可能会造成程序错误,影响程序结果。
2.2( ) 函数调⽤运算符
接受⼀个或者多个运算对象:第⼀个运算对象是函数名,剩余的运算对象就是传递给函数的参数。
#include <stdio.h>
void test1()
{
printf("hehe\n");
}
void test2(const char *str)
{
printf("%s\n", str);
}
int Add(int x , int y)
{
return x + y ;
}
int main()
{
test1(); //这⾥的()就是作为函数调⽤运算符。
test2("hello bit.");//这⾥的()就是函数调⽤运算符。
int x=1,y=2;
int add;
add=Add( x , y );//这里的()也是函数调用运算符
return 0;
}
大家可能看到这个符号的第一瞬间想到的就是正常括号,在范围内改变运算顺序。但实际上,函数调用运算符和括号的功能还真不一样。
具体特点:
①函数调用运算符的第一个运算对象就是其前面的函数名,这个也是不可缺少的运算对象。(你调用函数,总不能连函数都没有吧)
②函数调用运算符内部,更像是括号和逗号运算符形式上的结合,因为括号和逗号运算符都失去其本身的功能,逗号在这里仅仅起到分隔参数的作用,而没有顺序求值的作用。
③函数调用运算符的参数个数没有上限,具体看其调用的函数需要多少个参数。
3.运算符的属性:优先级、结合性
C语⾔的运算符有2个重要0属性:优先级、结合性,这两个属性决定了表达式求值的计算顺序。
3.1优先级
优先级指的是,如果⼀个表达式包含多个运算符,哪个运算符应该优先执⾏。各种运算符的优先级是 不⼀样的。
3 + 4 * 5;
上⾯⽰例中,表达式 3 + 4 * 5 ⾥⾯既有加法运算符( + ),⼜有乘法运算符( * )。由于乘法 的优先级⾼于加法,所以会先计算 4 * 5 ,⽽不是先计算 3 + 4 。
3.2结合性
如果两个运算符优先级相同,优先级没办法确定先计算哪个了,这时候就看结合性了,则根据运算符 是左结合,还是右结合,决定执⾏顺序。⼤部分运算符是左结合(从左到右执⾏),少数运算符是右 结合(从右到左执⾏),⽐如赋值运算符( = )
7* 6 / 3;
上⾯⽰例中, * 和 / 的优先级相同,它们都是左结合运算符,所以从左到右执⾏,先计算 7 * 6 , 再计算 6 / 3。
运算符的优先级顺序很多,结合性也是分为从右向左和从左向右两种,大家可以结合下表记忆。
参考:https://zh.cppreference.com/w/c/language/operator_precedence