回覆列表
  • 1 # 上進的白雲5

    1、這個涉及到函式的呼叫約定

    執行結果跟編譯器有一定的關係,不同的編譯器引數的入棧的順序不同

    一般的編譯器是從右到左

    如fun(a,b)這個函式呼叫,是先計算引數b,入棧,再計算引數a,入棧

    2、printf("%d %d", a++,++a); //先計算++a,先自增,a的值變為2,將2入棧 再來計算a++,將a的值2入棧,再使a自增,a的值變為3

    printf(" %d\n",a); //a的值已經變為3了

    3、printf(%d %d", ++a.a++);//先計算a++,將a的值1入棧,再使a自增,a的值變為2,再來計算++a,先自增,a的值為3,將3入棧,輸出3 1

    printf(" %d\n",a); //輸出3

    4、三種呼叫約定:

    __stdcall呼叫約定。兩者實質上是一致的,即函式的引數自右向左透過棧傳遞,被呼叫的函式在返回前清理傳送引數的記憶體棧,但不同的是函式名的修飾部分(關於函式名的修飾部分在後面將詳細說明)。

    C呼叫約定(即用__cdecl關鍵字說明)和__stdcall呼叫約定有所不同,雖然引數傳送方面是一樣的,但對於傳送引數的記憶體棧卻是由呼叫者來維護的(也正因為如此,實現可變引數的函式只能使用該呼叫約定),另外,在函式名修飾約定方面也有所不同。

    __fastcall呼叫約定是“人”如其名,它的主要特點就是快,因為它是透過暫存器來傳送引數的(實際上,它用CX和EDX傳送前兩個雙字或更小的引數,剩下的引數仍舊自右向左壓棧傳送,被呼叫的函式在返回前清理傳送引數的記憶體棧),在函式名修飾約定方面,它和前兩者均不同。

  • 中秋節和大豐收的關聯?
  • 白色月季花瓣為什麼一開就乾枯的?