則該函式或表示式有副作用

2021-08-13 09:10:55 字數 1204 閱讀 2315

在第三行中,x和y是遞增/遞減之前,他們的評價,所以他們的新值列印由cout。在第五行,乙個原始值的臨時副本(x = 6,y = 4)傳送給cout,然後原來的x和y是遞增的。這就是為什麼從字尾式操作符的結果沒有改變到下一行。

規則:在增量和後減量後有利於預增加和預減量。字首版本不僅更加高效,你就不太可能遇到奇怪的問題。

***如果某個函式或表示式修改某個狀態(例如記憶體中的任何儲存資訊),輸入或輸出,或者呼叫具有***的函式,則該函式或表示式有***。

大多數情況下,***是有用的:

123

x = 5;

++x;

std::cout << x;

上面例子中的賦值操作符具有永久改變x值的***。即使語句完成執行後,x的值也將為5。++運算子具有增加x x的輸出具有修改控制台的******。

然而,***也會導致意想不到的結果:

int add(int x, int y)

int main()

c++沒有定義在函式的引數進行評估。如果先對左引數進行求值,則這將成為乙個新增(5, 6)的呼叫,等於11。如果首先對正確的引數進行求值,則這將成為新增(6, 6)的呼叫,等於12!請注意,這只是乙個問題,因為乙個引數的函式()有***。

123

4567

8int main()

下面是另乙個流行的例子:

這個程式列印什麼值?答案是:它是未定義的。

如果+ +是在分配應用於x,答案是1(字尾運算子++遞增x從1到2,但其值為1,使表達變得x = 1)。

如果+ +是賦值後應用於x,答案會是2(這個值為x = x,然後字尾運算子++應用,增加x從1到2)。

還有其他的情況下,c++並不指定某些東西的計算順序不同,所以編譯器會做出不同的假設。甚至當c++不清楚事情應該怎樣評價,一些編譯器實現涉及的變數具有***的不當行為。這些問題通常可以通過確保任何應用於***的變數在給定語句中使用不止一次來避免。

規則:不要在給定語句中使用多於一次應用於其的***的變數。如果這樣做,結果可能是未定義的。

請不要問為什麼違反上述規則的程式產生的結果似乎沒有意義。這就是當你寫的程式有「未定義的行為」時會發生的情況。

有關未定義行為的更多資訊,請重新閱讀第1.3課的「未定義行為」部分——首先檢視變數、初始化和賦值。

命名函式表示式 有識別符號的函式表示式

定義函式的三種方法 1.函式宣告 function functionname arg0,arg1,arg2 函式宣告最重要的乙個特性是函式宣告提公升,即在執行 之前會先讀取函式宣告,因此可以把函式宣告放在呼叫它的語句後面。2.函式表示式 2種 也叫函式字面量 2.1沒有識別符號的叫匿名函式 拉姆達函...

函式 函式表示式 作用域 閉包

var f function function f 函式宣告和函式表示式的主要區別是,函式宣告會被前置,而函式表示式作為變數,會被提公升。下方是js執行時的邏輯 前置和變數提公升 var f function f f function var f function function f f 上方 直...

表示式計算 四則運算(有括號)的計算

問題描述 輸入乙個只包含加減乖除和括號的合法表示式,求表示式的值。其中除表示整除。輸入格式 輸入一行,包含乙個表示式。輸出格式 輸出這個表示式的值。樣例輸入 1 2 3 4 5 樣例輸出 4資料規模和約定 表示式長度不超過100,表示式運算合法且運算過程都在int內進行。includeusing n...