我是 C 新手,我在這里寫偽代碼:
void fn(a) {}
fn(b)
假設在函式體中fn發生的是這個賦值是正確的
`a = b`
我知道我們可以傳遞參考/指標而不僅僅是值。我知道了。但從本質上講,它仍然執行此分配parameter = argument對嗎?
我想知道:
- 是否有任何官方術語?
- 這個任務究竟是什么時候發生的,究竟是什么導致了這種情況發生?是編譯器嗎?
uj5u.com熱心網友回復:
是否有任何官方術語?
函式呼叫的官方語意在 C 標準的“函式呼叫”部分討論。沒有專門用于將值分配給引數的術語。
C 2017 草案 N4659 8.2.2 “函式呼叫” [expr.call] 4 說:
呼叫函式時,每個引數 (11.3.5) 都應使用其對應的引數初始化 (11.6, 15.8, 15.1)……
這個任務究竟是什么時候發生的,究竟是什么導致了這種情況發生?是編譯器嗎?
它發生在呼叫函式時。編譯器負責生成生成執行源代碼語意(由 C 標準定義)的程式的代碼。
uj5u.com熱心網友回復:
C 標準描述了執行環境、各種陳述句的結果和各種運算式的結果。編譯器只需要生成在運行時生成結果的代碼,就好像它在所描述的執行環境上運行一樣。
就您的實際問題而言,這意味著源代碼中的函式呼叫在實際硬體上運行時不一定會轉換為任何型別的呼叫或跳轉指令。
例如,給定函式:
int sqr(int x, inty)
{
return x*y;
}
編譯器很可能只是就地計算這樣的結果,而不執行任何型別的引數傳遞。但是,您是否真的可以依靠這種行為是編譯器實作者的一個細節。
話雖如此,在實際硬體上并且沒有行內,函式呼叫的引數非常類似于任何其他變數初始化(考慮復制而不是分配)。確切的細節(例如引數評估的順序)由每個實作決定。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/409053.html
標籤:
