1. 程式人生 > >函式引數的壓棧順序

函式引數的壓棧順序

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 轉載請標明來源)

先來看一道面試題:

設int arr[]={1,2,3,4 };

int *ptr=arr;

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

面試題的答案是: 2, 2

這個面試題為什麼會這樣呢? 原因就跟函式的壓棧順序有關,先壓棧哪一個,哪一個就會被先計算,後壓棧哪一個,那一個就會被後計算。

對於常見的C++程式,像預設_cdecl或使用_stdcall的函式壓棧順序都是採用的從右往左壓棧的。(_pascall使用的從左往右壓棧。)

我個人認為從右往左壓棧的好處比較明顯,把第一個引數放在了棧頂,取用比較方便,另外對於可變引數而言,使用第一個引數可以確定剩餘哪些輸入引數需要取用。

下面也是一個例子,用於進一步說明從右往左取的引數:

void TestFunc()

{

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

         int nSize = sizeof(arr)/sizeof(int);

         ViewArray(arr, nSize);

         int* ptr = arr;

         *(ptr++) += 1;

         ViewArray(arr, nSize);

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

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

}

像上面的輸出為

6 7 8 9

7 7 8 9

8, 8

9, 8

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 轉載請標明來源)

相關推薦

printf函式引數順序

printf函式的引數的壓棧順序和求值順序(VC++6.0編譯器) 有以下程式段: 設int arr[]={6,7,8,9,10}; int *ptr=arr; *(ptr++)+=123; printf("%d,%d",ptr,(++ptr));

VC++函式引數順序

今天閒來無事寫了一段程式碼:int Func1(int x,int y){ return (x&y)+((x^y)>>1); } void main(){ int Array[] = {1,2,3,4,5}; int *ptr = A

函式引數順序

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 轉載請標明來源) 先來看一道面試題: 設int arr[]={1,2,3,4 }; int *ptr=arr; printf("%d,%d",*ptr,*(++ptr)); 面

C語言函式呼叫時引數順序以及函式指標的作用

1、函式引數壓棧的順序 很多人都知道壓棧的順序時從右向左進行壓棧,具體的可觀測的結果如下程式執行。我們都知道Pascal的引數入棧順序時自左向右的,但是為什麼C語言會選擇自右向左呢?這也是C語言比pascal高階的一個地方-C語言通過這種引數入棧的順序實現了對變長引數函式的

C語言函式呼叫引數的相關問題

引數入棧的順序 以前在面試中被人問到這樣的問題,函式呼叫的時候,引數入棧的順序是從左向右,還是從右向左。引數的入棧順序主要看呼叫方式,一般來說,__cdecl 和__stdcall 都是引數從右到左入棧。看下面的程式碼: #include <stdio

函式呼叫 的工作原理【轉】

(轉自:https://blog.csdn.net/u011555996/article/details/70211315) 1.開篇   本篇文章著重寫的是系統中棧的工作原理,以及函式呼叫過程中棧幀的產生與釋放的過程,有可能名字過大,如果不合適我可以換一個名字,希望大家能夠指正,小丁虛心求

關於函式引數的思考

程式碼開發執行環境: VS2017+Win32+Debug 1.呼叫約定簡介 首先,要實現函式呼叫,除了要知道函式的入口地址外,還要向函式傳遞合適的引數。向被調函式傳遞引數,可以有不同的方式實現。這些方式被稱為“呼叫規範”或“呼叫約定”。C/C++中

printf函式引數的執行順序的簡單探究

大部分人應該都對printf函式比較瞭解,這也是作為c語言初學者第一個遇到的函式吧!! 哈哈,就是那個什麼(列印hello,world)啊,當時當被問到printf函式的執行順序的時候,好多人

C語言函式引數的彙編理解

先來看這樣一段程式: #include <string.h> #include <stdlib.h> #include <stdio.h> void print1(int a,int b,int c) { printf("%p

深入剖析C函式引數的結合順序及a++和++a的區別

C語言函式引數的結合順序 今天上課時老師提出了一個關於C語言的函式引數的結合順序的問題以及a++和++a有什麼區別的問題,為了弄清楚這個問題,我寫了如下的程式碼反彙編進行分析: #include <stdio.h> #include <

printf 引數順序

先看一段程式碼 a=1; printf("%d %d\n",a,a++); a=1; printf("%d %d\n",a++,a); a=1; printf("%d %d %d

函式呼叫過程中,函式引數的入順序

      函式呼叫過程中,第一個進棧的是(主函式中的)呼叫處的下一條指令(即函式呼叫語句的下一條可執行語句)的地址;然後是函式的各個引數,而在大多數C/C++編譯器中,在函式呼叫的過程中,函式的引數是由右向左入棧的;然後是函式內部的區域性變數(注意static變數是不入

C/C++函式引數的入順序,計算順序和可變引數的實現

函式引數入棧順序 #include void foo(int x, int y, int z) { printf("x = %d at [%X]\n", x, &x); printf("y = %d at [%X]\

輸入兩個整數序列,第一個序列表示順序,請判斷第二個序列是否為該的彈出順序

ack pan back 表示 return i++ ++ 輸入 gpo 1 class Solution{ 2 public: 3 bool IsPopOrder(vector<int> pushV,vector<int> popV){

輸入兩個整數序列,第一個序列表示順序,請判斷第二個序列是否可能為該的彈出順序。假設的所有數字均不相等。例如序列1,2,3,4,5是某順序,序列4,5,3,2,1是該壓棧序列對應

    輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否可能為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應     import java

順序的幾個基本操作 彈出 數制轉換 等等

// 順序棧.cpp: 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include"stdlib.h" #define STACK_INIT_SIZE 100 #define STACKINCREAMENT 10 typedef int e

Windows下DEVC++ 5.11 的printf函式引數的執行順序

printf函式為其引數建立一個[棧],從右到左將引數壓入棧,再從棧內將裡面的元素依次列印。 函式舉例 #include <stdio.h> int p(int a) { print

建構函式引數初始化的順序

下面列出總結: 1.成員變數在使用初始化列表初始化時,與建構函式中初始化成員列表的順序無關,只與定義成員變數的順序有關。就是(通常是private下)定義變數的先後順序。所以一般建構函式的初始化列表和定義順序相同。 2.如果不使用初始化列表初始化,在建構函式內初始化時,無

Printf函式和cout函式引數執行順序以及自增與自減

Printf函式和cout函式引數執行順序以及自增與自減 總結: 在VC++ 6.0下: C程式碼:      1、printf函式的執行順序是由右到左的 2、前自增運算子(++i)先加

dup2函式引數順序配圖分析

引言: 之前在學習Linux程序間通訊時,使用了管道來傳遞資料。而管道與管道之間對接採用dup2函式進行連線,發現dup2函式的兩個引數填充順序著實有趣,兩個管道之間到底是怎麼對接成功的呢?學習了一下以配圖分析的方式呈現。 一、使用場合 首先介紹這個圖: