python = 賦值順序 && C++ side effect
阿新 • • 發佈:2020-08-11
title: python = 賦值順序 && C++ side effect
date: 2020-03-17 15:00:00
categories: [python][c++]
tags: 語法
先是python = 的運算順序不清楚,然後搞明白了之後自然就想知道C++是什麼樣的
1 python =
1.1 形如 a,b=a,b
寫了一個測試:
可見賦值順序是從 = 右側第一個數開始向右。
同時如果出現被賦值的數是按照原來的值計算。
原因我想應該是 = 實現的方法也是函式, = 右側的a,b先把原來的值壓棧了。
a,b=-1,-2 a,b,b,a,b=1,2,3,b,a print(a,b) -2 -1 a,b=-1,-2 a,b,b=1,2,3 print(a,b) 1 3
1.2 鏈式賦值
a=b=c=1 順序是:a=1,b=a,c=a
>>> k,l=0,[10,20,30,40] >>> k=l[k]=3 >>> l #下面的結果顯示l[3]=3,說明k先被賦值為3,才有l[3]賦值為3 [10, 20, 30, 3] >>> >>>> k,l=0,[10,20,30,40] >>> k=l[k]=l[l[k]-1]=3 >>> l #跟上面結果對比表明:l[k]-1=2,說明l[k]比l[l[k]-1]先執行賦值 [10, 20, 3, 3] https://blog.csdn.net/LaoYuanPython/article/details/95300934
2 C++ side effect
總結就是子表示式的求值順序是不確定的(C++98/03). 不清楚C11 C14的標準。
所以儘量應該不用或者加上括號
在一個表示式裡,子表示式的求值順序是沒有定義的。特別的是,你不能假定表示式從左向右求值。 int x=f(3)+g(7) 沒有定義 f(),g()哪個先呼叫。
int i=1; v[i]=i++;
結果也是沒有定義的或者是v[1]=1,或者是v[2]=1。
但是有三種運算子的計算順序是有定義的:逗號(,),邏輯與(&&),邏輯或(| |)。它們保證了左邊的運算物件一定要先於右邊的運算物件計算。如:b=(a=2,a++)計算後把3賦給b。&&只有在第一個運算物件為true時才算第二個。| |只有在第一個運算物件是false時才算第二個,這叫短路求值。
注意區分逗號的兩種用法:
f1(v[i],i++) 兩個引數;
f2( (v[i],i++) ) 逗號表示式;
對於f2來說引數只有一個相當於i++。
原文連結:https://blog.csdn.net/cxyol/article/details/625713