1. 程式人生 > 實用技巧 >python = 賦值順序 && C++ side effect

python = 賦值順序 && C++ side effect


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

https://blog.csdn.net/ox_thedarkness/article/details/613122

https://blog.csdn.net/garfee_guan/article/details/12403987