所有运算符按排行如下
优先 级 | 运算符 | 运算对象要求个数 | 运算方向 |
---|---|---|---|
1 | () [ ] - > . | 左 至 右 | |
2 | ! ~ ++ -- - (负号) (type) & sizeof | 单目运算符 | 右 至 左 |
3 | * / % | 2 目运算符 | 左 至 右 |
4 | + - | 2 目运算符 | 左 至 右 |
5 | >> << (移位运算) | 2 目运算符 | 左 至 右 |
6 | > >= < <= | 2 目运算符 | 左 至 右 |
7 | == != | 2 目运算符 | 左 至 右 |
8 | & (按位与) | 2 目运算符 | 左 至 右 |
9 | ^ (按位异或) | 2 目运算符 | 左 至 右 |
10 | | | 2 目运算符 | 左 至 右 |
11 | && | 2 目运算符 | 左 至 右 |
12 | || | 2 目运算符 | 左 至 右 |
13 | ? : | 3 目运算符 | 右 至 左 |
14 | 赋值 | 2目运算符 | 右 至 左 |
其中 , 运算符为最低级的运算符 。
看几个例子:
#include <stdio.h>
int main(){
// No 1
int a,b,c = 1;
a = 1;
c = ++a;
printf("%d %d \n",a,c);
b = c++;
printf("%d %d \n",c,b);
/*
结论: ++a 从右至左 右侧没有没有数据的时候 。
a++ 的运算优先级 直接降低在14之后 ,也就是赋值运算符后面。
*/
int j = 0;
if(j=j++){
printf("*%d\n",j);
}
if(j= ++j){
printf("**%d\n",j);
}
if(j=j--){
printf("***%d\n",j);
}
/*
结论:
1.当在进行逻辑运算时 。 = 式两边看 右 侧;
2.印证了第一点的结论
*/
return 0;
}
/*
输出结果:
2 2
3 2
**1
***1
*/
之后看一个比较难得例子:
// 字符串的复制
#include <stdio.h>
int main(){
char str1[20] = "hollow";
char str2[20];
char *p1 = str1;
char *p2 = str2;
while(*p2++ = *p1++);
/* 解释一下一步一步来:
其中出现 () * ++ = 运算符.
() 属于 一级 也就是最高级运算符。
其中 * 运算符与 ++ 运算符同属 第二级, 操作方向自右至左;
赋值运算符 属于 14 级。 操作方向 自右至左;
so: 括号中 从右边看起由于 其右侧没有任何数据。因此自降运算级别在 14 到 15之间 。
然后直接 *p1 。 此时判断 while()。
若存在,为 *p2 赋值,若不存在。 退出循环。
若还在循环 p2++ ; p1++ ; 这个很清晰
直接就是数组的指针运算
*/
printf("%s",str1);
return 0;
}