c++默认参数顺序为什么是自右往左?为什么不能从左往右呢?请问这是什么原因。
学习是最好的投资!
自右往左 可以支援任一參數
參數是要壓棧的,棧 是先入後出,如果是從左往右壓入棧中,要找到最左邊的第一個參數就很麻煩~
壓棧順序和大端字節序和小端字節序一樣,哪個都可以的。 C語言預設選擇從右往左,應該是因為堆疊是向下增長的,所以這樣會使壓入的參數記憶體排列正好和書寫的順序一致而已,調試看內存可能比較方便。不過實際程式碼存取都是棧指標+偏移的方式,所以對於機器來說沒有特別意義。 能不能支援可變參數,主要是看是不是由呼叫者負責清除堆疊。例如__stdcall也是從右往左壓棧,但是被呼叫者清除堆疊,所以不支援可變參數。 __pascal是模仿PASCAL語言從左到右壓棧,VC已經不再支援了。
假設由左往右
int f(int a = 1, int b);
那你f(1)的1到底是傳給了a還是b呢。 。所以是不能從左往右的。 。
自右往左 可以支援任一參數
參數是要壓棧的,棧 是先入後出,如果是從左往右壓入棧中,要找到最左邊的第一個參數就很麻煩~
壓棧順序和大端字節序和小端字節序一樣,哪個都可以的。 C語言預設選擇從右往左,應該是因為堆疊是向下增長的,所以這樣會使壓入的參數記憶體排列正好和書寫的順序一致而已,調試看內存可能比較方便。不過實際程式碼存取都是棧指標+偏移的方式,所以對於機器來說沒有特別意義。
能不能支援可變參數,主要是看是不是由呼叫者負責清除堆疊。例如__stdcall也是從右往左壓棧,但是被呼叫者清除堆疊,所以不支援可變參數。
__pascal是模仿PASCAL語言從左到右壓棧,VC已經不再支援了。
假設由左往右
那你f(1)的1到底是傳給了a還是b呢。 。所以是不能從左往右的。 。