Search
Search
今天繼續來看運算子,昨天提到:運算子可以想成是一個函式,這個函式會將前後兩個參數,傳入對應的JS內建函式中,進行運算並回傳。 那是什麼決定運算子的執行順序呢?
#3. [JavaScript Weird]Day 15 — 運算子的相依性與優先性 - Medium
2019年1月19日 — 運算子優先性( Operator Precedence ) ... 運算子優先性表示「哪個運算子優先被運算」,是JavaScript 用來判斷當同一行程式碼有不只一個運算子時,決定優先 ...
#4. 淺談JavaScript中運算子的優先順序 - 程式前沿
JavaScript 中的運算子優先順序是一套規則。該規則在計算表示式時控制運算子執行的順序。具有較高優先順序的運算子先於較低優先順序的運算子執行。例如, ...
js 運算子優先順序 總結. 2018-11-11 254. 下面的表將所有運算子按照優先順序的不同從高到低排列(來源:MDN). 優先順序, 運算型別, 關聯性, 運算子.
#6. [29] 文法- 運算子優先序、結合性 - CoderBridge
keywords: operator precedence , associativity. 運算子優先序. 在前一章我們介紹到運算式副作用, () 本身無法定義一個新的包裹運算式,不過如果想 ...
#7. JS &&優先順序vs === - JAVASCRIPT _程式人生
根據javascript documentation, === 運算子的優先順序高於 && 運算子。 ... 但是,正如我在node,chrome和firefox中嘗試過的那樣,js引擎總是短路並返回 false 例如
#8. 六角學院JS 核心筆記(十五)【運算子、型別與文法】- 優先性和 ...
優先 性Operator precedence:決定運算子運算或是說被語法解析的優先順序。 相依性Associativity:當優先序相同時,使用相依性決定運算方向。
#9. JavaScript 運算子Operators - Fooish 程式技術
從運算子(operator) 和運算元(operand) 的關係,JavaScript 的運算子,有 ... 各種運算子在處理上的優先次序(precedence) 是依一般算術規則,先乘除後 ...
#10. [javascript]運算子優先順序和強制轉換所造成的問題 - 點部落
在javascript 中運算子的表達方式(+-*/...etc.) 其實在javascript的引擎中+-*/ 自己本身就是一個function. 如a+b ...
#11. (4)javascript的運算子以及運算子的優先順序 - 拾貝文庫網
標籤:三元運算子 char 運算子 img 級別 java 語句 des 部分. 運算子的使用方法. 在javascript的程式中要完成各種各樣的運算,是離不開運算子的。
#12. 12-6 流程控制12-7 函式12-8 陣列
當運算式中有多種運算子時,JavaScript 會依照如下的優先順序執行運算. 子,優先順序高者先執行,相同者則按出現的順序由左到右依序執行。 P.12-14~15. Page 19. 12-6 流程 ...
#13. 運算子優先順序
運算 式的種類、計算與轉換 · [Pascal] 程式設計教學:使用運算子(Operator) · 05 expression operator and statement.ppt [相容模式] · 第五章運算式、運算子與敘述 · js運算子 ...
#14. 02【JS基礎】-【 運算子】運算子/ 算數運算子/ 遞增和遞減運算 ...
02【JS基礎】-【 運算子】運算子/ 算數運算子/ 遞增和遞減運算子/ 比較運算子 / 邏輯運算子/ 賦值運算子/ 運算子優先順序.
#15. 運算子
運算子. 運算子的種類. 運算子有下列數種: ... 運算子的優先順序. 括弧() 一元運算子- ++ -- ! ~ 乘除餘數* / % 加減+ - 位移(位元) >>> >> << 比較> >= < <= 相等 ...
#16. 都2020了,還不懂js運算子優先順序? - ITW01
function f this.a 1 this.f function this.a 3 f.f function this.a 2 var r new f.f 複製程式碼a. a: 2 b. a: 1, f: ƒ c. a: 3 答案答案: a 先 ...
#17. 這些JS 中強大的操作符,總有幾個你沒聽說過 - IT人
下面的表將運算子按照優先順序的不同從高(20)到低(1)排列,但這個不是最新的,至少沒包括可選鏈,建議參考這個表或者MDN。
#18. JavaScript教學- 運算子(Operators) - 上 - 小殘的程式光廊
介紹JavaScript中的運算子(Operators)的用法,包含種類、優先順序、算術運算子(Arithmetic Operator)、指派運算子(Assignment Operator)、位元運算.
#19. 【筆記】Javascript大全- 02 運算式與運算子 - Yakim shu
讀了javascript大全到這章,發現許多以前不懂的概念與原理,像是運算過程會進行的類型轉換,以及邏輯運算子的優先順序是如此重要,都是真的要翻書才 ...
#20. C 語言:運算子優先次序和運算次序 - 傑克! 真是太神奇了! - 痞客邦
運算子優先 權(C 語言)Percedence Table 運算子Operator 說明Description 結合順序Associativity 1 ()[]
#21. 位元與移位運算子- C# 參考 - Microsoft Docs
位元補充運算子~; 左移運算子<<; 右移位運算子>>; 邏輯AND 運算子&; 邏輯互斥OR 運算子^; 邏輯OR 運算子|; 複合指派; 運算子優先順序; 移位運算子的移位計數 ...
#22. 運算子 - OpenHome.cc
當+兩邊的運算元有一個是字串時,就會作字串的串接,而整個運算式中有數字也有字串時,要注意運算順序。例如:. js> 1 + 2 + '3'; 33 js> '1' + 2 + 3;
#23. 鐵人賽:JavaScript 的文法學 - 卡斯伯Blog
運算子 用簡單的一點的方式說明, +、=、== 都是運算子, ... 高代表優先度高,也會被優先執行,而Associativity 則是文法閱讀的順序,大家也可以直接 ...
#24. Weird-JavaScript 12:運算子的優先性與相依性 - Luffy
運算子 的優先性指的是,哪一個運算子會優先被JS 引擎呼叫執行? 也就是說,許多運算子擺一起時, JS 會先執行擁有較高優先次序的運算子。
#25. c 運算子餘數 - Seort
位移位運算子是將資料看成二進位制數,對其進行向左或向右移動若干位的運算。 ... 上會和數學邏輯一樣的順序運算優先順序: 括號內=> 乘/ 除/ 取餘數=> 加/ 減乘運算子.
#26. [JAVA]運算子-運算子的優先順序 - 程式開發學習之路
優先 值運算子同等順序1括號:()、[]由右至左2遞增++、遞減--、負號-、NOT!、補數~由左至右3乘*、除/、取餘數%由左至右4加+、減-由左至右5位元左移< ...
#27. 第18章JavaScript的基本語法 - 林偉川
JavaScript 裡,宣告變數時,必須使用var ... JavaScript提供了一些由算術運算子與指 ... 式。以下的例子,將說明運算子的優先處理. 順序。 → 5*2 > 6 && 7+8 < 8.
#28. 新手必讀的JavaScript(5):賦值運算子
(5) 賦值運算子JavaScript 中的賦值運算子,賦值運算符是「=」。第一次接觸程式碼的人可能會以為它. ... Python控制結構4.運算子優先順序(Operator precedence)一覽.
#29. 今天的Python控制結構課程(4)探討運算子優先順序!
Python控制結構進入到第四課,這章節我們要講的是運算子優先順序! 運算子優先順序(operator precedence)在包含Python 及其他的程式語言都是很重要的概念。它是數學.
#30. JavaScript 的運算子們
JavaScript 的運算子們. ... 優先順序要高於+ - (小學教的用上錯不了) ... 賦值運算子的優先順序低於算數運算子; 賦值運算子的結合性是右結合性(從右 ...
#31. PHP基本語法之表示式及運算子優先順序- 雅瑪知識
PHP基本語法之表示式及運算子優先順序. 方法/步驟. 表示式是PHP的重要基石。 $a = 5;. 在PHP中,幾乎所寫任何一個東西都是一個表示式。 簡單卻最精確的定義一個表示式 ...
#32. 關於c 運算子優先順序和的?
daojs模組都匯出processrequest(request,response)即可,比如實現一個register.js(只輸出字串register). c++中優先順序和運算子先看哪個?
#33. 在Amazon CloudSearch 中設定運算式
JavaScript 優先順序規則 適用於運算子。您可以使用括號覆寫運算子優先順序。 評估邏輯運算式時將使用捷徑評估法;如果運算式經評估第一個引數後即可判定其值,便不會 ...
#34. Javascript運算子操作 - 程序員學院
一、作用. 執行特定邏輯運算 · 二、分類:按功能劃分 算數運算子("+" , "-" ,"*" ,"/" , "%). 位運算子. 關係運算子. 邏輯運算子 · 三、優先順序. 先算優先 ...
#35. javascript 運算子現代 - Ptnoe
具有相同優先順序的運算子按從左至右的順序求值。 ... JavaScript 核心觀念(12)-運算子,型別與文法-ASI 自動插入分號發表於2020-06-13 更新於2020-06-21 分類於JavaScript ...
#36. 運算子優先序- JavaScript | MDN| 輕鬆健身去-2022年2月
延伸文章資訊 · 1. 優先級任務列表:: Nozbe Help · 2. 优先级- MBA智库百科 · 3. 优先级_百度百科 · 4. 每個部門都提需求,怎麼決定優先順序?PM分享:先排問題... · 5. 运算符 ...
#37. 【克服JS 】第三章型別與運算子~ 竹白記事本
JavaScript 全攻略:克服JS 的奇怪部分,第二章型別與運算子Typing and ... 若運算子的優先性都相同,那就是依據相依性來判斷順序,決定是左到右還是 ...
#38. c語言運算子優先順序以生成規則描述運算子的優先順序 - SBGQZ
如+, -, *,/ 與= 等符號. 運算式. 不同的運算子, 有不同的associativity (結合方向)。 減號的規則是left-associative 由左向右算; 而乘方的規則卻是right-associative ...
#39. Python新手練功之控制結構篇4.運算子優先順序一覽 - 工程師的 ...
Python教學中的運算子優先順序(operator precedence)在包含Python 以及其他的程式語言都是很重要的概念。它是數學運算順序(如先乘除後加減)概念的 ...
#40. JavaScript的變數與運算子- 高中資訊科技概論教師黃建庭的 ...
將數值或變數進行運算,需要使用運算子,運算子分成指定運算子、算數運算子、比較 ... 順序是有其規則的,這些規則定義在程式語言裡,以下是JavaScript運算子的優先權 ...
#41. [JS奇怪的世界]No.16 運算子的優先性與相依性 - 是Ray 不是Array
運算子 的優先性與相依性. 這兩個名詞在JavaScript 是一個非常重要的東西,而且是非常重要的觀念,如果能瞭解其觀念,對於debug 上也是有一定幫助的。
#42. [C 語言] 程式設計教學:如何使用運算子(Operators)
sizeof 長得很像函式,但是 sizeof 是運算子,需注意。 運算子優先順序. 如果同一行敘述內用到多個運算子時,要如何確認那個運算子會先運算呢 ...
#43. JS趴趴往上走-運算式與運算子篇
大家有興趣了解運算子的優先順序和運算方式可以到MDN參考哦! JavaScript.
#44. javascript int 補0 筆記:int?(Nullable)運算與??運算子優先順序
筆記:int?(Nullable)運算與??運算子優先順序-黑暗執行緒. 對null進行大小比較時,其結果恆為false,例如:int? value = null, ...
#45. Python控制結構課程第四課-運算子優先順序一覽 - AI方程式
運算子優先順序 (operator precedence)在包含Python 及其他的程式語言都是很重要的概念。它是數學運算順序(如先乘除後加減)概念的延伸,並包含其的 ...
#46. c語言運算子優先順序C語言運算子優先順序 - Ddmba
查看docs.microsoft.com 上的所有75 行運算式的計算要依據運算符號的優先順序(precedure)與結合律(associativity)的規則,結合性與語意。 這個章節將講述JavaScript 的 ...
#47. c 中關於等運算子優先順序的運算 - 迪克知識網
c 中關於等運算子優先順序的運算,1樓系儉佴綾你的四個式子是在同一個程式中的且是依此的吧?若是,運算如下i 與i的區別i 是先令i參加其它運算, ...
#48. 你能在JavaScript中映射以下運算式的執行順序嗎? - 有解無憂
uj5u.com熱心網友回復:. 如果您查看運算子優先級。 > 具有最高優先級; && 是下一個優先; || 是下一個 ...
#49. Javascript 三元運算子
Javascript 基礎打底系列三邏輯運算子與短路邏輯Short Circuit Logic 的 ... 和遞減運算子比較運算子邏輯運算子賦值運算子運算子優先順序Tw511教學網 ...
#50. JavaScript 入門指南- 運算式與陳述
運算 式(expression) 由運算元(operand) 與運算子(operator) 所組成 單一運算元就構成一個 ... 的優先順序在= 之前,所以a != b 會先被計算,結果才會指派到f 之中。
#51. [筆記] JavaScript 的基本觀念– 7 – 運算子 - 地瓜大的飛翔旅程
JavaScript 的運算子符號,有所謂的優先性(Precedence)。當優先性高的和低 ... 若兩個同時優先性相同,就會看優先性順序,由右而左或是由左至右處理。
#52. 使用控制結構
若條件成立所執行的程式碼只有一行,JavaScript 允許省略大括號。 ... 一般來說and 和or 的優先順序比大部分的運算子低,因此可不用加括號,但not 的優先順序高於比較 ...
#53. [JavaScript][JS][教學] ES5基礎#08. 加減乘除與先後順序
#54. [JavaScript]使用控制結構 - Steven玄
JavaScript 具有大部分程式語言提供的標準條件敘述,其語法來自Java 和C, ... 一般來說 and 和or 的優先順序比大部分的運算子低,因此可不用加括號, ...
#55. [Java] 5-1 Operator Precedence運算子的優先序 - 給你魚竿- 痞 ...
Operator的優先順序要知道但是不用強記因為不確定時可以用()來決定順序大方向就是()括號最優先再來是本身屬性改變, 先乘除餘後加減再位移邏輯運算後位 ...
#56. C中運算子優先順序的問題,c中的運算子優先順序順序是什麼
1樓:金色潛鳥. 假定陣列是int y=; 指標是int *symbol=y; int x=222;. 語句*(symbol++)=x; 因為是字尾++, 表示式裡不自增,故計算分2步走,(版1_1) ...
#57. c 中優先順序和運算子先看哪個 - 極客派
zhi3. 答案就是. ++*iter. 相當dao於. ++(*iter),先執行. '*'然後執行'++'. 4.int test[2] = ...
#58. js邏輯運算子 - 軟體兄弟
js 邏輯運算子, 此篇是給新手看的,老手可以直接上一頁了這篇要來仔細研究的是邏輯 ... 介紹JavaScript中的運算子(Operators)的用法,包含種類、優先順序、算術運算.
#59. 誰知道c 裡面的運算子的優先順序呀 - 好問答網
誰知道c 裡面的運算子的優先順序呀,1樓獨享藍山1 先bai 括號內層,後du 括號外層。zhi 解釋 ... 即可,比如實現一個register.js(只輸出字串register).
#60. js 運算子是什麼意思
JS運算子 ,js 運算子是什麼意思,1樓匿名使用者這是js 指令碼的強大經典靈巧之處了。樓上的說的對, ... 是非的意思,優先順序高於||所以你的**.
#61. c關於運算子優先順序,c中的運算子優先順序順序是什麼
c關於運算子優先順序,c中的運算子優先順序順序是什麼,1樓因為只是在這copy條語句結束後才1假設a0則aa等同於00當然是錯的了但是現在a的值變為1補充 ...
#62. JavaScript 入門課程- 第三章運算子(Operator)3-1 算術運算子
上面代碼中,物件 obj 是一個 Date 物件的實例,並且自定義了 valueOf 方法和 toString 方法,結果 toString 方法優先執行。
#63. 邏輯運算子彙整 - 數位行銷大時代
在JavaScript教學裡,其中的邏輯運算子,又稱為「布林運算字(Booleen Operators)」,是可以用來評估表達式,並且回 ... 運算子優先順序(Operator precedence)一覽.
#64. JavaScript 型別轉換的那些事
但麻煩的是在JavaScript 中運算子會執行一些包藏禍心的型別轉換,像是: ... 的使用後,還要注意到二元加號運算子具有左結合率,以及運算子優先順序:.
#65. 筆記:int?(Nullable<int>)運算與??運算子優先順序 - 黑暗執行緒
同事回報某段C#程式發現Bug: int lastQty = 100; int? soldQty = null; int leaveQty = lastQty - soldQty ?? 0; soldQty 由其他系統傳入可能為null ...
#66. 逗號運算子- 維基百科,自由的百科全書
這是代碼的執行結果,與原文中結果相符。 逗號運算子在C/C++中作為順序點的顯式標記,同時具有最低的優先級 ...
#67. mdn/translated-content - translated-content/index.html at main ...
title: 運算子優先序. slug: Web/JavaScript/Reference/Operators/Operator_Precedence. tags: - JavaScript. - Operator. - precedence.
#68. 怎麼樣控制Python的結構呢?(9) - 程式設計師的七種人格
今天Python要來教大家運算子的運算先後順序! 錯過可惜喔! ... 下方表中列出了Python教學 的運算子的優先順序,優先順序由高至低如下: ...
#69. 型別、變數與運算子
不能使用JavaScript關鍵字、內建函式的名稱、內建物件. 的名稱。 ... 單元運算子:只有一個運算元,使用前 ... 10-3-7 運算子的優先順序.
#70. 控制流程· 從ES6開始的JavaScript學習生活
由於程式碼的執行順序,是由最上方的程式碼開始,往下逐行執行。有些時候,我們需要在其中特定 ... 符號的比較)的規則如下(假設x是左邊的運算子,而y是右邊的運算子):.
#71. c语言运算子优先顺序 - 掘金
JavaScript运算 符基本术语和运算优先级介绍! MCL. 7月前. 算法 · 洛谷 ...
#72. javascript i 與i 的區別?
第二個(++s)=7;s=7;. 第三個(++s)=8;s=8;. 原理就是+是從左到右,()優先順序高於+. 可以看看mozilla的js的文件:運算子優先順序 ...
#73. [C++, CPP 教學教程教材Tutorial] 運算子(Operator)
介紹C++的運算子(Operator), 一元運算子, 二元運算子, 左結合性(Left to Right), 右結合性(Right to Left), 優先權, 算術運算子, 指派運算子, 相等運算子, 關係運算子, ...
#74. js利用與或運算子優先順序實現if else條件判斷運算式 - Alibaba ...
... result 才是True。 如果任一運算式的值等於False, 則result 為False。 ... js利用與或運算子優先順序實現if else條件判斷運算式_javascript技巧.
#75. 05 JavaScript的運算子 - 9W個人設計工作室
為了讓大家清楚JavaScript的物件架構,在這一部份課程會針對以下圖片來說明物件: ... 各算術運算子在處理上的優先次序(precedence) 是依一般算術規則:先乘除、後 ...
#76. 內容簡介 為你的網頁增添生命與光釆 『對所有JS開發者來說 ...
第18章 瀏覽器中的 JavaScript 第19章 jQuery 第20章 Node 第21章 物件特性設置與代理器 第22章 其他資源 附錄A 保留字 附錄B 運算子優先順序
#77. 5. JavaScript 運算子- ZoeHYH/mentor-program-4th Wiki
語法解析順序. 優先性. 相同的優先性再考慮相依性。 相依性. 左相依性. 右相依性. 依運算子需要幾個值分類. 一元運算子Unary Operator. 二元運算子Binary Operator.
#78. PHP教學- 運算子(Operators) - 上 - icodding愛程式
介紹PHP中運算子的用法,包含種類、優先順序、算術運算子(Arithmetic Operator)、指派運算子(Assignment Operator)、位元運算子(Bitwise Operator)、比較運算 ...
#79. JavaScript運算符優先級規則
了解JavaScript運算符優先規則的基礎. 每個複雜的語句都會引入優先級問題。 拿著這個: ... 同一級別的操作(例如 + 和 - )按照找到的順序執行.
#80. Python教學-控制結構(4)運算子優先順序Operator precedence
運算子優先順序 (operator precedence)在包含Python 及其他的程式語言都是很重要的概念。它是數學運算順序(如先乘除後加減)概念的延伸,並包含其的 ...
#81. JavaScript入門教學看這裡!(4)數學運算子
承第一個例子,試想一下,如果我們把「var x = 20 + 30」使用字串表示,變成「var x = "20 + 30"」的話,答案就不會是20 + 30 的和,而是以字串形式呈現 ...
#82. JavaScript 的文法學
所以這段只要了解優先性就可以知道答案,MDN 有提供完整的表可以參考:運算子優先等級,表中的Precedence 數值越高代表優先度高,也會被優先執行, ...
#83. JavaScript中运算符优先级的问题? - 知乎
如果是左结合,则先出现的操作对应的AST节点比后出现的操作的节点离根更远;换句话说,先出现的节点会是后出现节点的子节点。 所谓求值顺序,就是在遍历子节点时的顺序。对 ...
#84. Javascript运算符优先级
JavaScript 运算 符优先级,是描述在计算机运算计算表达式时执行运算的先后顺序。 先执行具有较高优先级的运算,然后执行较低优先级的运算。 例如,我们常说的先执行相乘和 ...
#85. [分享] 運算子優先順序? - 看板C_and_CPP - 批踢踢實業坊
C++ Primer 4/e (P.170) 中,運算子優先序(Operator Precedence) 如下表: ?: (conditional) expr ? expr : expr 右—結合性= (assignment) lvalue ...
#86. JavaScript中运算符优先级的高低顺序是什么? - html中文网
下表按从最高到最低的优先级列出JavaScript运算符。具有相同优先级的运算符按从左至右的顺序求值。 优先级, 运算类型, 关联性 ...
#87. [JS] JavaScript 運算子(Operator) | PJCHENder 未整理筆記
[TOC]. 條件判斷(conditional statement). 物件(object): 都是true(空物件也是true); 陣列(array):陣列是一種物件,因此都會是true(空 ...
#88. JavaScript中逻辑运算符(&&、||、!)的优先级和运算顺序
对逻辑运算符只停留在会用的层次,一直没有专门了解其原理。今天得空,好好深究一下,这里做个笔记,用来参考。三个逻辑运算符(&&、||、!)优先级 ...
#89. JS运算符优先级和结合性一览表 - C语言中文网
优先级 运算符类型 结合性 运算符 21 圆括号 n/a(不相关) (…) 20 成员访问 从左到右 …. … 20 需计算的成员访问 从左到右 …
#90. 前端基础:函数与函数式编程 - 前端知识
纵观JavaScript中所有必须需要掌握的重点知识中,函数是我们在初学时最容易 ... 比变量声明具有更为优先的执行顺序,即我们常常提到的函数声明提前。
#91. js各运算符的执行顺序- 一粒一世界 - 博客园
JavaScript 运算 符优先级,是描述在计算机运算计算表达式时执行运算的先后顺序。 先执行具有较高优先级的运算,然后执行较低优先级的运算。
#92. 跨裝置網頁設計(第三版)- HTML5、CSS3、JavaScript、jQuery、Bootstrap、jQuery ...
12-5-9 運算子的優先順序當運算式中有多種運算子時,JavaScript 會依照下表的優先順序執行運算子,優先順序高者先執行,相同者則按出現的順序由左到右依序執行。
#93. HTML5、JavaScript、CSS、XHTML、Ajax網頁程式設計 (第五版)(電子書)
10 - 3 - 9 運算子的優先順序當運算式中有多種運算子時, JavaScript 會依照如下的優先順序執行運算子,優先順序高者先執行,相同者則按出現的順序由左到右依序執行。
#94. JavaScript網頁設計與TensorFlow.js人工智慧應用教本(電子書)
2-3-1 運算子的優先順序因為 JavaScript 提供多種運算子,而且在同一個運算式允許使用多種運算子,為了讓運算式能夠得到相同的運算結果,運算式會以運算子預設的優先順序 ...
#95. JavaScript+jQuery +Node.js網頁設計與物聯網應用開發教本(電子書)
2-3-1 運算子的優先順序因為 JavaScript 提供多種運算子,而且在同一個運算式允許使用多種運算子,為了讓運算式能夠得到相同的運算結果,運算式會以運算子預設的優先順序 ...
#96. JavaScript+jQuery Mobile+Node.js跨平台網頁設計範例教本(電子書)
2-3-1 運算子的優先順序因為 JavaScript 提供多種運算子,而且在同一個運算式允許使用多種運算子,為了讓運算式能夠得到相同的運算結果,運算式會以運算子預設的優先順序 ...
運算子優先順序js 在 [分享] 運算子優先順序? - 看板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 編譯錯誤。
不知道這樣理解對嗎?謝謝。
... <看更多>