美文网首页
[c]运算中的优先级小例

[c]运算中的优先级小例

作者: 叨码 | 来源:发表于2017-11-17 02:42 被阅读7次

    身为c语言小白,看如下小例:

    /* 指针运算中的优先级*/
    #include<stdio.h>
    int data[2] = {100,200};
    int moredata[2] = {300,400};
    
    int main(void){
        int *p1,*p2,*p3;
    
        p1 = p2 = data;
        p3 = moredata;
    
        printf("*p1 = %d,*p2 = %d,*p3 = %d\n", *p1,*p2,*p3);
        printf("*p1++ = %d,*++p2 = %d,(*p3)++=%d\n", *p1++,*++p2,(*p3)++); 
        printf(" *p1 = %d,*p2 = %d,*p3=%d\n", *p1,*p2,*p3);
    
        return 0; 
    }
    

    结果是什么,不妨先想一下 ~~~~~ 一连串苦思冥想状】
    然后运行结果如下:

    *p1 = 100,*p2 = 100,*p3 = 300
    *p1++ = 100,*++p2 = 200,(*p3)++=300
    *p1 = 200,*p2 = 200,*p3=301
    

    和你想的一样么?反正当初和我的不一样。。。一阵操作猛如虎,再看人头0-5。。。

    为什么 *p1++ 不是101 ??? 为什么 ++p2 是200 ,(p3)++是300?

    其实这就是优先级的问题和对指针的理解了:
    1, * 和自增++ 优先级一致。
    2, p1 p2 p3是指针。
    3,表达式的值就是*地址 取出的值== 这点很重要!
    那么*p1++ 正确的理解应是 先是计算*p1 取p1里的值100作为表达式的值,然后 p1向后移动1个自身长度的偏移量,也就是指向下一个地址。所以第二个printf输出的*p1++的值依旧是100 ,而到了第三个printf时,此时p1已经指向了下一个地址 ,所以此时取值得到200.
    同理,*++p2 先是++p2 也就是将p2指向下一个地址,然后*p2 取值,得到data[1] 也就200,所以第三个printf打印*p2的值就是200.
    其实比较难理解的是(*p3)++ 为什么是300 而不是301呢?根据我们前边说的 表达式的值 就是看*取的哪个地址的值。这里(*p3)取得就是p3此时对应的值也就是300 ,所以表达式的值就是300,这之后实际变为了(300)++ 变为301, 存入p3.所以第三个printer打印出的*p3的值是301.
    

    所以再回头理解一遍:

    *p1++ : *取的是哪个地址里的值呢 是p1的 所以表达式值为100,然后p1++运算,p1指向下一个地址。
    *++p2:*取得哪个地址里的值呢?是++p1里的值,那么就是p1指向下一个地址 里面存在的值 也就是200了。
    (*p3)++:*取得哪个地址里的值呢?是p3里的值,所以就是300,然后(300)++ 存入p3.
    

    不知道 我理解的对不对,解释的对不对。
    我小白一枚,望高手指教指点~不胜感激呀。

    相关文章

      网友评论

          本文标题:[c]运算中的优先级小例

          本文链接:https://www.haomeiwen.com/subject/fzkdvxtx.html