C语言小白必看——操作符详解(操作符优先级)
Posted 燕麦冲冲冲
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言小白必看——操作符详解(操作符优先级)相关的知识,希望对你有一定的参考价值。
这里是目录哟~
一、操作符的优先级
由于操作符很多,一般网上搜到的优先级会是一张特别大的表,非常不便于大家记忆,那今天我就大家来巧记操作符的优先级
1.1 括号类操作符首当其冲
() 和 []
它们之间不太可能去争夺到底谁先谁后,只要比非括号类型的先操作就行了。
而圆括号又分两种,一种就是普通的括号,一种是函数的参数列表。
方括号的学名叫做下标引用操作符,在数组中出现。
1.2 结构体成员访问操作符紧随其后
. 和 ->
同上,它们依然不会出现去争谁先谁后的问题,只要比除括号类操作符优先级低以外,比其它类操作符优先级都高。
.的使用实例
struct Person
{
int age;
char name[10];
};
int main()
{
struct Person p = { 18, "zhangsan"};
printf("%d %s", p.age, p.name);
return 0;
}
-> 的使用实例
struct Person
{
int age;
char name[10];
};
int main()
{
struct Person p = { 18, "zhangsan"};
struct Person* ptr = &p;
printf("%d %s", ptr->age, ptr->name);
return 0;
}
1.3 后缀自增(减)
看似后缀自增(减)应该是滞后操作的,但实际上是先作用的。
但是并不意味着违背了其核心先使用后自增(减)。
比如下面带大家来看一个例子:
实现的是模拟字符串拷贝函数
void my_strcpy(char* dest, char* src)
{
while(*dest++ = *src++)
{
;
}
}
这个代码非常巧妙地利用了后缀的自增(减)操作符
下面介绍其原理与操作符的顺序:
首先看到while循环条件,第一步后置加加生效,但是并没有立即使指针src++,因为符合后置加加的规律:先使用后加加。
第二步*解引用操作符生效,把src指向的字符赋值给dest指向的字符,实现了第一个字符的拷贝。
接下来后置++的自加才真正生效,src和dest指针向后跳动一个字符,一次循环结束。
重复上述的三个步骤,直至src指向了’\\0’,因为’\\0’的ASCII码值为0,会导致循环终止。
注意while()括号内的值为dest所指向的字符的ASCII码值。
1.4 逻辑反、按位取反和正负号
!逻辑反
~按位取反
+(单目)正号
-(单目)负号
它们之间就有严格的先后顺序了,如果遇到了就需要区分一下。
从前往后优先级降低
1.5 前缀自增(减)
其核心其实就是一句话:先加加(减减)后使用。
1.6 间接访问和取地址
*间接访问
&取地址
从上到下优先级降低
所以需要注意的是,*和&的优先级相对其它操作符都是较低的,所以使用的时候需要养成一个好习惯,就是带上括号。
1.7 sizeof、强制类型转换、四则运算
这个也没什么可说的,从前往后优先级降低。
1.8 移位
<<左移位
>>右移为
1.9 比大小
比较操作符是:大于、小于、等于和不等于之类的。
1.10 位操作符
注意:这都是对内存中的补码进行操作的。
&按位与 ———— 两个比特位上的二进制数有一个0,其结果为0,若都为1,结果为1
|按位或 ———— 两个比特位上的二进制数有一个1,其结果为1,若都为0,结果为0
^按位异或 ———— 相同为0,相异为1
1.11 逻辑操作符
&&逻辑与 ———— 其左侧结果如果为0则不再计算其右侧表达式,整个表达式结果均为0
||逻辑或 ———— 其左侧结果如果为1则不再计算其右侧表达式,整个表达式结果均为1
1.12 条件操作符(三目)
: ?
可用于简化下列代码
int Max(int a, int b)
{
if(a>b)
{
return a;
}
else
{
return b;
}
}
简化后:
int Max(int a, int b)
{
return a>b?a:b;
}
1.13 复合赋值
+=
-=
*=
/=
&=
^=
|=
1.14 逗号操作符
,
(a+b,b+c,c+=2);
上式最终计算的结果为c+=2的值
但是a+b和b+c依然会进行运算
二、操作符小练习
2.1 求二进制数中1的个数
思路来源
代码如下:
int main()
{
int num = 0;//输入要检测的数字
scanf("%d", &num);
int count = 0;//用于计数
int i = 0;
for (i = 0; i < 32; i++)
{
if (1 == ((num >> i) & 1))
{
count++;
}
}
printf("%d\\n", count);
return 0;
}
2.2 求一个数字是不是2的n次方
思路来源:
代码如下:
int main()
{
int num = 0;//输入要检测的数字
scanf("%d", &num);
int count = 0;//用于计数
int i = 0;
for (i = 0; i < 32; i++)
{
if (1 == ((num >> i) & 1))
{
count++;
}
}
if (1 == count)
{
printf("这是2的n次方\\n");
}
return 0;
}
以上是关于C语言小白必看——操作符详解(操作符优先级)的主要内容,如果未能解决你的问题,请参考以下文章