一不小心就容易出错的c语言运算符优先级

    有些人说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);

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TPCloud

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值