有些人说c语言是简洁高效的,又有些人说c语言是深邃复杂的,说实话,这确实是仁者见仁智者见智。但是有一点不可否认,c语言中的运算符众多,不注意的话,确实很容易弄错。
一、*与.的优先级比较
对于一个结构体p包含一个指针*f,那么*p.f的运算优先规则是怎样?
*p.f = *(p.f)
int main() {
struct student{
char *name;
int score;
};
struct student stu ;
stu.name = "tpc";
stu.score = 100;
printf("the first name is %c\n",*stu.name);
printf("the first name is %c\n",*(stu.name));
}
二、*与[]的优先级比较
int *ab[]。
错误结合:int (*ab)[],代表ab是一个指向整数数据的指针。
正确结合:int *(ab[]),代表ab是一个存储整数指针的的数组
int main() {
int ta[2][2] = {1,2,3,4};
int *ab[] = {&ta[0][0], &ta[1][0]};
for(int i=0;i<2;i++){
printf("the element %d value is %d\n", i, *ab[i]);
}
}
三、*与()的优先级比较
int *ab()
错误结合:int (*ab)(),代表ab是返回整数的函数指针。
正确结合:int *(ab()),代表ab是一个返回整数指针的函数
int *ab(){
int *t = (int *) malloc(sizeof(int));
*t = 100;
return t;
}
int main() {
int *a = ab();
printf("the method return value is %d\n", *a);
free(a);
}
四、等于比较符号与位操作的优先级比较
if(a&mask !=0)
错误结合:if((a&mask) != 0)
正确结合:if(a&(mask != 0))
int main() {
int a=101;
int mask = 1;
if(a&mask!=0){
printf("the mask is bigger than zero\n");
}
}
五、等于比较符号与赋值符的优先级比较
int a = b !=100;
错误结合:int (a = b) != 100
正确结合:int a = (b != 100)
int main() {
int b = 100;
int a = b !=0;
printf("the a is %d\n", a);
}
六、算术运算符号与移位符的优先级比较
a << 4 + 1
错误结合:(a << 4) + 1
正确结合:a << (4+1)
int main() {
int a = 1;
a = a << 4+1;
printf("the a is %d\n", a);
int b = 1;
b = (b<<4)+1;
printf("the b is %d", b);
}
标签:ab,优先级,name,int,运算符,100,main,一不小心 From: https://blog.csdn.net/tpc4289/article/details/144216375