Python 程式設計# 運算子優先順序 # Python 訂閱學習Youtubehttps://www.youtube.com/c/wuchaiyen?sub_confirmation=1成為這個頻道的會員並獲得 ... ... <看更多>
「python運算子優先順序」的推薦目錄:
- 關於python運算子優先順序 在 [分享] 運算子優先順序?: 大於= 大於, - 看板C_and_CPP 的評價
- 關於python運算子優先順序 在 Python程式設計#Python運算子#運算子優先順序 ... - YouTube 的評價
- 關於python運算子優先順序 在 運算子優先權| 他山教程,只選擇最優質的自學材料 的評價
- 關於python運算子優先順序 在 網路上關於python //運算子-在PTT/MOBILE01/Dcard上的升學 ... 的評價
- 關於python運算子優先順序 在 網路上關於python //運算子-在PTT/MOBILE01/Dcard上的升學 ... 的評價
- 關於python運算子優先順序 在 網路上關於python //運算子-在PTT/MOBILE01/Dcard上的升學 ... 的評價
- 關於python運算子優先順序 在 小吳哥教學中心- Android Studio在Windows安裝| Facebook 的評價
python運算子優先順序 在 運算子優先權| 他山教程,只選擇最優質的自學材料 的推薦與評價
從Python 文件:. 下表總結了Python 中的運算子優先順序,從最低優先順序(最小繫結)到最高優先順序(大多數繫結)。同一個框中的運算子具有相同的優先 ... ... <看更多>
python運算子優先順序 在 網路上關於python //運算子-在PTT/MOBILE01/Dcard上的升學 ... 的推薦與評價
Python 控制結構進入到第四課,這章節我們要講的是運算子優先順序! 運算子優先順序(operator precedence)在包含Python 及其他的程式語言都是很重要的概念。它是數學. ... <看更多>
python運算子優先順序 在 網路上關於python //運算子-在PTT/MOBILE01/Dcard上的升學 ... 的推薦與評價
Python 控制結構進入到第四課,這章節我們要講的是運算子優先順序! 運算子優先順序(operator precedence)在包含Python 及其他的程式語言都是很重要的概念。它是數學. ... <看更多>
python運算子優先順序 在 網路上關於python //運算子-在PTT/MOBILE01/Dcard上的升學 ... 的推薦與評價
Python 控制結構進入到第四課,這章節我們要講的是運算子優先順序! 運算子優先順序(operator precedence)在包含Python 及其他的程式語言都是很重要的概念。它是數學. ... <看更多>
python運算子優先順序 在 小吳哥教學中心- Android Studio在Windows安裝| Facebook 的推薦與評價
Java 運算子優先順序 與實作. February 23, 2021 at 4:54 AM · 593 Views. 15 people like this. 27:09. Python 程式設計-精通運算子. ... <看更多>
python運算子優先順序 在 [分享] 運算子優先順序?: 大於= 大於, - 看板C_and_CPP 的推薦與評價
C++ Primer 4/e (P.170) 中,運算子優先序 (Operator Precedence) 如下表:
?: (conditional) expr ? expr : expr 右—結合性
= (assignment) lvalue = expr 右—結合性
, (comma) expr, expr 左—結合性
####
考慮以下程式:
int main() {
1 ? puts("123"), puts("456") : puts("789"), puts("ABC");
return 0;
}
執行後:
123
456
ABC
眾所接知的是 ?: 是唯一的三元運算子,所以上面的運算中,
運算元I 必然是常數 1,
運算元II 只能是被夾在中間的運算式 puts("123"), puts("4567"),
運算元III 有兩種可能:
puts("789")
puts("789"), puts("ABC")
其中,第二種可能代表 puts(789) 先與 comma 綁定成一體,
成為 (puts("789"), puts("ABC")) 之後,才以運算元III 的身份參戰。
從結果來看,顯然 comma 運算子的優先次序,確實低於 ?: 運算子。
####
接著把 , 改成 = (賦值),再次驗證 ?: 的優先地位。
#include <stdio.h>
int main() {
int a = 1, b = 2;
1 ? a = 55 : b = 66;
printf("a = %d, b = %d", a, b);
return 0;
}
執行後 (C++ Compiler):
a = 55, b = 2
執行後 (C Compiler):
error C2106: '=' : 左運算元必須是左值 (l-value)
這裡就出現爭議了。
####
假設: 其實 ?: 優先權高於 assignment (=)
那就應該跟上次的分析過程相同,其運算元III 同樣為 b,又判斷式為 true,
最終傳回運算元II 當作 result,再以此 result 去執行最後的 = 66,
即 if (true) { (a = 55) = 66 };
又 C99 標準的規定是:
A conditional expression does not yield an lvalue.
故 55 = 66 得到一個 C2106 編譯錯誤,也是合情合理的。
又 C++03 標準的規定是:
If the second and third operands are lvalues and
have the same type, the result is of that type and is an lvalue.
故 (a = 55) 可以得到同樣是 int 型態的左值,最後再跑 = 66
理論上,最後會讓 a 變成 66,但實際結果是 55。
可見「?: 優先權高於 =」這個假設是錯的。
假設: 其實 ?: 優先權跟 assignment (=) 相等
在這個假設之下,因為 b 參與 ?: 跟 = 兩個運算子,雙方優先權相等,
所以依照右結合性,運算元III 將是 (b = 66),最終結果吻合 C++ 編譯器
跑出來的結果。
但 C 編譯器說「左運算元必須是左值」,此錯誤在此假設下,
就變成無理取鬧了。
運算元II 中「a = 55」是左值;
運算元III 中「b = 66」 亦為左值。
可見「?: 優先權等於 =」這個假設應該也是錯的。
世界上根本就沒有 "運算子優先權表",也可以說人人都是...
在 C++03 標準中,有這麼一句話:
The precedence of operators is not directly specified,
but it can be derived from the syntax.
根據 C99 / C++03 兩標準,可知
conditional-expression:
logical-or-expression
logical-or-expression ? expression : ┌ C++ 標準:assignment-expression
└ C99 標準:conditional-expression
重點就是,"assignment-運算式" 包含 "conditional-運算式",前者是後者的超集,
一個 "賦值運算式" 文法上可以替換成 "條件運算式",但反過來就不行。
所以 1 ? a = 55 : b = 66; 這個 statement 中,
可以把 b = 66 當成 "賦值運算式",最終使整個 statement,
在 C++ 文法下變成一組條件運算式。
但 C 的文法下,運算元III 要求是更狹窄的條件運算式,所以只能是 b 本身,
最終導致 a 的右值無法跟 66 進行運算的錯誤。
至於 comma 運算子,只能出現在 "賦值運算式" 的超集 "expression" 內:
expression:
assignment-expression
expression , assignment-expression
已知 "expression" 可以轉成 "賦值運算式",但是 "賦值運算式" 無法長大
變成 "expression",故 ?: 的運算元III 不會有 , 的參與。
故 1 ? puts("123"), puts("456") : puts("789"), puts("ABC"); 的結果
會是印出 123 456 ABC
除非在 "expression" 左右兩邊加上 () 就會變成 primary-expression,就可視為
單純的運算元使用了。
關於 ?: 的總結
一、不當左值用
int a = 10; int b = 20;
( 1 ? (a = 30) : (b = 40) ) = 50;
printf("a = %d, b = %d\n", a, b);
結果是 a = 50, b = 20
哪天心血來潮把這段 code 貼到 C 就編譯錯誤了;
在 C++,把 int b 改成 short int b 就又編譯錯誤了,不經改的東西很難用。
二、最好不要用
看別人程式碼,若運算式寫落落長,又沒加小括號,
這時看運算子優先權表格來判斷,還是很方便的,前提就是別碰到 ?:
根據經驗,只要 ?: 的冒號後面塞了一堆東西,就是傷眼睛的時候了。
賦值變數 = ? 數值1 : 數值2;
求絕對值函數( (a > b)? 數值1 : 數值2 );
像這樣簡單的形式,則是無妨的。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 124.8.132.109
感謝。
依據 C++03 在 5.17 Assignment operators 的內文中說:
The result of the assignment operation is the value stored in the
left operand after the assignment has taken place;
the result is an lvalue.
所以 (a = 55) = 66 這樣的運算,在 C++ 環境下,a 應該可以得到 66。
同時,在 C 的環境下,總是會變成 invalid lvalue in assignment 編譯錯誤。
不知道這樣理解對嗎?謝謝。
... <看更多>