zoukankan      html  css  js  c++  java
  • printf计算参数是从右到左压栈的(a++和++a的压栈的区别)

    一、问题

    c++代码:

    #include <iostream>
    #include <stdio.h>
    using namespace std;
    int main(){
        int a=1;
        cout<<a++<<" "<<a<<endl;//12
        a=1;
        cout<<a<<" "<<a++<<endl;//21
        a=1;
        printf("%d %d
    ",a,a++);//21
        a=1;
        printf("%d %d
    ",a++,a);//12
    }

    java代码:

    public class Test{
        public static void main(String[] args){
            int a=1;
            System.out.println((a++)+" "+a);//1 2
            a=1;
            System.out.println(a+" "+(a++));//1 1
        
        }
      }

       对比两段代码,可知JAVA代码中比较有规律(从左到右),而C中的规律呢?(向下看)

    C代码:

    #include "stdafx.h"
    #include <iostream>
    #include <stdio.h>
    using namespace std;
    int a=1;
    int afun(){
        printf("调用afun(){a++;}
    ");
        return a++;
    }
    int bfun(){
        printf("调用bfun(){a;}
    ");
        return a;
    }
    void main(){
        //printf("%d %d
    ",a++,a);//12
        printf("%d %d
    ",afun(),bfun());
    }

    运行结果:

      注意与之前直接打印所输出的结果不同(为什么啊???往下看):

    (1)直接打印 printf("%d %d ",a++,a);//输出12

    (2)函数调用 printf("%d %d ",afun(),bfun());//输出11

    二、原理(cout与printf原理一样)

    下面内容参考博文http://blog.csdn.net/kzzhr/article/details/8482657

                             http://www.zzzj.com/html/20090609/71613.html

          其实,在处理printf时,压栈顺序为从右往左,也就是说从右往左的计算(“计算”不等于“输出”)。

      a++和++a的压栈的区别:在计算时,遇到x++会记录此时的x的值作为最后的输出结果。遇到x和++x的时候不会将此时的计算结果作为最终的输出只会修改x的值,在最终输出的时候都输出x的值(所以++x和x的结果总是一样的)。

          为什么会是这个样子呢?参见某高手解释吧:

          对于a++的结果,是有ebp寻址函数栈空间来记录中间结果的,在最后给printf压栈的时候,再从栈中把中间结果取出来;而对于++a的结果,则直接压寄存器变量,寄存器经过了所有的自增操作。

  • 相关阅读:
    linux 命令——19 find (转)
    linux 命令——18 locate (转)
    linux 命令——17 whereis(转)
    linux 命令——16 which(转)
    linux 命令——15 tail (转)
    linux 命令——14 head (转)
    Java for LeetCode 038 Count and Say
    Java for LeetCode 037 Sudoku Solver
    Java for LeetCode 036 Valid Sudoku
    Java for LeetCode 035 Search Insert Position
  • 原文地址:https://www.cnblogs.com/seven7seven/p/3622119.html
Copyright © 2011-2022 走看看