zoukankan      html  css  js  c++  java
  • printf函数的求值顺序问题

    学了这么久的C语言,没想到对C语言中常见的printf函数还不是很了解。

    有以下程序段:

    设int arr[]={6,7,8,9,10};

    int *ptr=arr;

    *(ptr++)+=123;

    printf("%d,%d",*ptr,*(++ptr));

    答案为什么是:8,8

    这是一道华为面试题。

    这个题考的关键就是printf的运算顺序。

    printf的参数,函数printf从左往右读取,然后将先读取放到栈底,最后读取的放在栈顶,处理时候是从栈顶开始的,所有从右边开始处理的。

    这个是比较绕的一个问题,主要考验的是i++ 和++i :

    我们逐个分析:
    int arr[]={6,7,8,9,10};

    int *ptr=arr;
    //这里ptr是数组的首地址。

    *(ptr++)+=123;
    //这个我们将之拆分
    //1. 首先是 ptr++, 这个时候重点看到是后++,也就是说返回的ptr还是原来的ptr的值,也就是arr的首地址。
    //那么这句话也就转换成了 a[0]+=123,即运算后 a[0] = 129
    //2. 这整句运行完之后,ptr才真正的++。也就是说,这个时候ptr指向的数组第二个位置,也就是7

    printf("%d,%d",*ptr,*(++ptr));
    //这一句有一个函数参数入栈的顺序,一般VC的编译器是从右往左入栈,那么这个运算也自然是从右往左。
    //++ptr之后ptr再次向后一个位置移动,即a[2],8。
    //前面的*ptr自然也就是8,所以这句运行之后输出的是8,8

  • 相关阅读:
    高精度模板 支持各种运算 c++
    404 页面不存在
    多柱汉诺塔问题“通解”——c++
    高精度gcd
    404 页面不存在
    如何开启音乐二倍速?不下载其他软件【win10】
    如何随时学习数学
    洛谷P1004 方格取数
    Title
    Title
  • 原文地址:https://www.cnblogs.com/ccf19881030/p/12004942.html
Copyright © 2011-2022 走看看