
c operator優先權 在 コバにゃんチャンネル Youtube 的最佳貼文

Search
因postfix ++的運算優先權高於*,可視為是*(p++),將指標p加1,因為是postfix,所以取的值為指標p加1之前所指向的值,結果為v = 10, array[0] = 10, array ... ... <看更多>
乘法比加法有更高的優先權, 所以上述的算式計算起來會先算B 乘以C, 然後再把結果和A 相加. 人類可以很容易地理解這種運算子的優先順序, 但是對機器而言, 就需要對每個 ... ... <看更多>
#1. C 語言:運算子優先次序和運算次序 - 傑克! 真是太神奇了!
運算子優先權(C 語言)Percedence Table 運算子Operator 說明Description 結合順序Associativity 1 ()[]
敘述 多載性 結合性 作用域解析(C++專有) 否 由左至右 字尾遞增 由左至右 字尾遞減 由左至右
#3. 優先順序和評估順序
C 運算子的優先順序和順序關聯性會影響運算式中運算元的群組和求值。 有其他優先順序更高或更低的運算子存在時,運算子的優先順序才有意義。
優先性; Precedence 運算子名稱; Operator type 相依性; Associativity 20 (en‑US) 無 19 (en‑US) 從左至右 19 (en‑US) 從左至右
#5. C語言運算子優先順序口訣- IT閱讀 - ITREAD01.COM
基本的優先順序需要記住:. 指標最優,單目運算優於雙目運算。如正負號。 先乘除(模),後加減。 先算術運算,後移位運算,最後位運算。
#6. 運算符優先權 - 中文百科知識
逗號表達式則規定從左到右依次進行求值。 C++. Operator, Description, Example, Overloadable. Group 1 ...
#7. 【C】C中的運算子優先順序(!=和|) - 程式人生
我最近在一個C程式中糾正了一個錯誤: ... 根據C operator precedence很明顯 != 優先於 | 。 ... 然而,我對優先權的看法卻很冷淡問題。
#8. 第五章運算式、運算子與敘述
f = d = printf("%d", a/=c); ... 一元運算子(unary operator)只需要一個運算元 ... 優先順序 a=b<=5&&c==0;. 1. 先計算b<=5 (<=的優先順序為6 ). 2. 再計算c==0 ...
#9. [C++, CPP 教學教程教材Tutorial] 運算子(Operator)
介紹C++的運算子(Operator), 一元運算子, 二元運算子, 左結合性(Left to Right), 右結合性(Right to Left), 優先權, 算術運算子, 指派運算子, 相等運算子, 關係運算子, ...
#10. [C 語言] 程式設計教學:如何使用運算子(Operators) - 技術文件
許多C 語言教材會用 printf 將資料輸出終端機,但我們刻意用 assert 巨集檢查運算結果是否正確。 ... 即使自己很熟運算子的優先順序,也不保證團隊成員都很熟。
#11. 運算式和運算子
運算子的優先權與結合性. ○ 型態轉換. 本章學習範例 ... 運算式是由運算元(operand)和運算子(operator)組成的,如左下圖, ... d = b * b – 4 * a * c;.
#12. C語言運算符 - 中文百科全書
中文名:C語言運算符; 外文名:Operators of C programming language ... 而與或非的運算優先權都不一樣,因此a && b || b && c解釋為(a && b) || (b && c).
#13. 運算式、運算子
運算子的優先權. ▫運算式之資料型態轉換 ... 運算子(operator): 如+、-、*與/等運算符號。 ... 在C語言中非零的數均代表true ...
#14. 算術運算式
一個算術式是由運算元(Operands)、運算子(Operators)和間隔符號(Delimiters)等三者所 ... 但是中序法有運算符號的優先權結合性問題,再加上複雜的括號困擾,對於編譯器 ...
#15. C語言運算符 - 華人百科
中文名稱C語言運算符外文名稱Operators. ... Operators of C programming language ... 而與或非的運算優先權都不一樣,因此a && b || b && c解釋為(a && b) || (b ...
#16. Expressions
三元運算子ternary operator: 需要三個運算元. ➢ A?B:C. A,B,C為三個運算元 ... 等號, assignment operator. ◇ 除了逗號(, ) 等號的計算優先權(precedence)是最低的.
#17. 程式語言CH7
Define operator precedence and operator associativity. 運算子優先權,運算子有優先權高低,高的先做運算運算子結合順序,結合順序有分左到右,右到左,再優先權 ...
#18. C語言: ++*p, *p++和*++p的不同
因postfix ++的運算優先權高於*,可視為是*(p++),將指標p加1,因為是postfix,所以取的值為指標p加1之前所指向的值,結果為v = 10, array[0] = 10, array ...
#19. Octave 算式(Expressions) - 頁6,共6 - G. T. Wang
當算式中包含多個運算子時,運算子優先權(operator precedence)會決定 ... a + b * c 的運算順序是先將 b 乘以 c 再加上 a ,也就是 a + (b * c) 。
#20. C語言
EX: C++、JAVA、VB、PHP、C#、Python、smalltalk ... %d 整數 int; %f 浮點數 float(6位)、double(14位); %c 字元 char ... operator, 結合性, 優先權.
#21. 資料型別與運算
++和--是所謂的unary operator,只能用於變數,可放在變數的前或後面,意義如下 ... 下表是C語言定義的優先權和結合順序,上方的列的優先權高於下方的列,同一列的運算 ...
#22. C 速查手冊- 單元3 - 運算式 - 程式語言教學誌
運算式(expression) 由運算元(operand) 與運算子(operator) 所組成,每個運算式 ... 其中,小括弧具有最高的優先權,因此當運算式中任何部份需要先計算時,可以直接用 ...
#23. Lecture 3
關係、布林、複合指定運算子. 運算優先順序 ... :a=10; b=4; c=false; d=true; e=true;f=false;g=true;h=false;. 範例(3-2.cpp) ... 布林運算子/ Boolean Operator.
#24. 指刪除Stack的Top頂端元素,如果堆疊是空
其中A,B,C,D為運算元(operand). +,-,*,/為運算子(operator). 1/1/97. 31. 【運算原則】. 括號內先處理. 優先權較高的運算子先執行. 同優先權者,則由其結合性, ...
#25. c 符號優先權
優先權 相同, 結合順序為'右至左' 所以是a?b:(c?d:e) a+=b<<c-d<<e 中+= 優先權14, ... 介紹C++的運算子(Operator), 一元運算子, 二元運算子, 左結合性(Left to Right), ...
#26. C shell 表示式及運算子 - IBM
... 都可以接受包括和C 語言類似的運算子表示式,且其優先順序相同。 ... 且檔案的查詢格式為(-operator Filename) 的表示式中使用,其中的operator 為下列其中一項: ...
#27. 授課教師:陳士杰 - 資料結構(Data Structures)
Operator (運算子) Operand 1(運算元1) Operand 2(運算元2). 優點: Compiler處理Prefix的計算,scan一次即可求得結果. ∵在前序式的表示式當中,已免除掉括號,優先權與 ...
#28. 一起幫忙解決難題,拯救IT 人的一天
【建立模型】2-4 流程與計算:運算式(Expression)與運算子(Operators)下集 ... 最後要來提個運算子當中不可不知概念,運算子優先權(Operator Precedence)。
#29. c語言運算子優先權第四章 - ZPFUF
PPT 檔案 · 網頁檢視C語言運算子的優先次序關係如下: 運算式表示法中序法(infix) ... 運算子優先權(Operator Precedence) 當算式中包含多個運算子時,運算子優先 ...
#30. [weeky 24]Operator precedence and Bitwise – Shaing's blog.
運算子優先權,屬於入門基礎知識,初階書籍都會帶到,網路上也有許多資源整理。但也因為這樣,其實實際開發你要遇到才…
#31. 中序式轉後序式(前序式) - OpenHome.cc
:x is operator: while (priority(stack[top]) >= priority(op)) [ ... 例如(a+b)*(c+d)這個式子,依演算法的輸出過程如下: ... int priority(char); // 運算子優先權
#32. C語言使得程式設計者能以結構化且有條理的方法
本書將簡單介紹C程式的設計,並舉出數個例子來 ... 第三和第四章將會介紹C的結構化程式設計 ... 算子優先權規則」(rules of operator precedence).
#33. 在無線網路中針對優先權傳送之排程技術研究
優先權 傳送 ; 點陣圖通道配置 ; 上鏈路狀態旗標 ; 吃到飽服務 ; 動態防護通道 ; 動態 ... customers' need and to improve the revenues of wireless operators.
#34. 中置式轉後置式
printf("%c",temp[top]);//若堆疊的top的operator優先權>= top--; //*或/就印出 } top++; temp[top]=ch[i]; } if(ch[i]=='+' || ch[i]=='-')//遇到+和-的情形
#35. 邏輯運算子順序 - 軟體兄弟
+(正號)---(負號)- -一元運算~ -位元邏輯運算++- , 運算子優先權(C 語言)Percedence Table 運算子Operator 說明Description 結合順序Associativity 1 ()[],大部分C ...
#36. Swift 運算符定義(Operator Declarations) | by Tzu-Yi Lin | Medium
但是我們如果將程式碼換成了let c = a.add(b),那事情就不是那麼簡單了。 ... infix operator <運算符號名稱> : <優先權群組>.
#37. 运算符优先级- Manual - PHP
另外一方面,"="是右联的,所以 $a = $b = $c 等同于 $a = ($b = $c) 。 没有结合的相同优先级的运算符不能连在一起使用,例如 1 < 2 > 1 在PHP是不合法的。
#38. 運算子、運算式與敘述
C ++語言的指定運算子(assignment operator)符 ... 我們在C++語言中,常常可以看到一種程式. 敘述,例如: int i=0; ... 下表列出了運算子之運算優先順序,優先權數字越.
#39. Python新手練功之控制結構篇4.運算子優先順序一覽 - 工程師的 ...
Python教學中的運算子優先順序(operator precedence)在包含Python 以及其他的程式語言都是很重要的概念。它是數學運算順序(如先乘除後加減)概念的 ...
#40. [JAVA]運算子-運算子的優先順序 - 程式開發學習之路
優先 值運算子同等順序1括號:()、[]由右至左2遞增++、遞減--、負號-、NOT!、補數~由左至右3乘*、除/、取餘數%由左至右4加+、減-由左至右5位元左移< ...
#41. Re: [分享] 運算子優先順序?: 大於= 大於, - 看板C_and_CPP
優先權 高於assignment (=) 那就應該跟上次的分析過程相同,其運算元III ... 在C++03 標準中,有這麼一句話: The precedence of operators is not ...
#42. 林瑞源 - Google 學術搜尋
ARM C 運算元(Operator)(89973). 盧正興, 林瑞源 ... ARM C 運算優先權(Precedence)(89975) ... ARM C 語言資料型態(data type) 與運算式(expression)(89962).
#43. 學習Swift程式語言:運算子重載(Operator Overloading)簡介
運算子重載(Operator Overloading)是每個計算機與語言裡面最強大的的功能之一, ... 150 – 同層級的優先權是標準的乘法計算,因為他是比較高優先權的運算子。
#44. C語言第三章03 運算子、運算元與運算式 - SlideShare
3-2-1 運算子優先順序3-2 運算子簡介P 3-4 <ul><li>以下是C 中各種運算子計算的優先 ... </li></ul></ul><ul><ul><li>因為負號的處理優先權高於乘號,所以會將-2 乘上3 ...
#45. 基本資料型態
x = a + b * ( c + 6.5 ) + c * 105.8 – 4.0;. 30/88. 敘述句的規範(2/2) ... 在同一個敘述內,當運算子的優先權相 ... C++邏輯運算子(logical operators). 邏輯運算子.
#46. 第七章Operators
在程式語言中, 指示程式進行運算(計算、比較或連結) 的符號, 稱為operators (運算子) ... 因comparison operator 較assignment operator 有優先權, 因此也可將a=(5==1) ...
#47. 算術運算式
運算元(Operand); 運算子(Operator); 間隔符號(delimiter,如括號)。 ... 優先權. 運算子. 運算子性質. 運算式表示法. 中序法(infix); 前序法(prefix) ...
#48. 電腦是怎麼進行四則運算的?前序式、中序式、後序式又是什麼?
... 和後序(Postfix Notation)的算式,它們差別是在運算子(operator,如 + ... 前序和後序不像中序這樣有運算子優先權以及括號內的算式要先算的問題。
#49. C++參考
C ++參考運算子(reference operator) ... C++中才有reference。 ... 為dobule的陣到到函式* &bar一定要括號,因為[]比&優先權高*/ void foo(double (&bar)[10]) {.
#50. c 語言運算子順序 - Yrcd
運算子優先權(C 語言)Percedence Table 運算子Operator 說明Description 結合順序Associativity 1 ()[] 註1: 這一條和K&R C 書上所列不同, 這是K&R C 原版的錯誤.
#51. /*通訊二492430021 陳威廷*/ /*程式就是可以把中序轉成後序 ...
n') { if(oper1(expr[i])) { if(!empty(operator)) /*比較優先權*/ while(pri(expr[i])<=pri(operator->data)&&!empty(operator)) { operator=pop(operator,&op); ...
#52. 位元運算子& AND, | OR, ^ XOR, ~ NOT @ 程式手扎:: 隨意窩
運算子優先順序 ... 在這個例子當中的& 運算子就是C/C++ 的AND 位元運算子,從這個例子可以看到& 運算子分別對unsigned char 的8 bits 做了AND 位元運算。
#53. 演算法筆記- Language
C Programming Language 使用的字元是ASCII當中的可見符號、換行、空白、……。 int ... 我們可以修改文法,讓文法擁有優先權和結合性;當文法擁有優先權和結合性,就 ...
#54. c語言運算子優先權 - JKE
當算式中包含多個運算子時,運算子優先權(operator precedence)會決定其運算的順序,例如乘法運算子* 都優先順序就會比加法運算子+ 高,因此a + b * c.
#55. Ch5-5
程式實例: ch5_5.c */ /* 中序四則運算式的值*/ ... 比較優先權迴路*/ priority(operator->data) && !empty(operator) ) { /* 從堆疊取出一運算子和兩運算元*/ ...
#56. 2018q1 Homework2 (assesment) - HackMD
在C 語言規格書中,找出對應運算子優先權的描述並嘗試解讀 ... Primary expressions; Postfix operators; Unary operators; Cast operators; Multiplicative operators ...
#57. [JavaScriptWeird]No.15 運算子的相依性與優先性 - 大专栏
運算子優先性( Operator Precedence ) ... 第三欄是運算子的相依性,決定當優先權相同時該如何運算的順序。 ... var a = 2, b = 3, c = 4 a = b = c;
#58. 運算式求值
... 將目前之運算子push到operator stack;(2)比較目前之運算子優先權是否 ... Scan C:輸出至後序運算式之後端; Scan /:pop堆疊top之operator且輸出至後序運算式之後端, ...
#59. 資料結構- 使用C 語言3 3.1 堆疊和佇列基本觀念
另外二種佇列,一為雙向佇列(deque),二為優先權佇列(priority queue)。 ... 一般的算術運算式皆是以中序法來表示,亦即運算子(operator)置於運算元(operand) ...
#60. swift-algorithm-club-zhTW/README.markdown at master
乘法比加法有更高的優先權, 所以上述的算式計算起來會先算B 乘以C, 然後再把結果和A 相加. 人類可以很容易地理解這種運算子的優先順序, 但是對機器而言, 就需要對每個 ...
#61. Precedence 的中文翻譯| 英漢字典
precedence 領先,在先,優先,優先權. ... precedence operator precedence 來源(3): Taiwan MOE computer dictionary [moecomp] precedence 優先權; 優先次序來源(4): ...
#62. precedence翻譯及用法- 英漢詞典 - 漢語網
priority優先;優先權;[數] 優先次序;優先考慮的事 ... in c/c++, expressions are based upon associativity, precedence of operators and a set of arithmetic ...
#63. c 語言運算子順序 - Buuchau
以下是結合順序之例子: a-b+c 中-和+ 同為優先權4, 結合順序為'左至右' 所以 ... 關於運算式關於運算式C語言運算式都是由下列2種元素所構成: 運算子(operator): ...
#64. 15. STL in C++
C ++之Standard Template Library (STL)為使用樣版功能所製作的標準類別 ... 元素依其優先權之值(priority value)之次序排序。 6. deque ... (c) assignment operator.
#65. c 運算子優先權 - Scupk
運算子優先權(C 語言)Percedence Table 運算子Operator 說明Description 結合順序Associativity 1 ()[] 註1: 這一條和K&R C 書上所列不同, 這是K&R C 原版的錯誤.
#66. 4.1. 語法結構 - PostgreSQL 正體中文使用手冊
在跳脫字串當中,使用倒斜線開頭,就可以使用C 語言式的倒斜線跳脫字串,通常是 ... OPERATOR 建構式被用來為任何運算子,取得如Table 4.2 中所示的預設運算優先權。
#67. [PERL] 06-運算子#2 @新精讚
有時可以用and代替&&;or 代替||,兩者差別是and/or 的優先權是運算子中最低的。 ... 範圍運算子又稱flip-flop operator,有兩種表示法:兩個點'.
#68. [分享] 運算子優先順序?: 大於= 大於, - 看板C_and_CPP
C++ Primer 4/e (P.170) 中,運算子優先序(Operator Precedence) 如下表: ?: ... 優先權高於assignment (=) 那就應該跟上次的分析過程相同,其運算元III 同樣為b,又 ...
#69. 运算符优先级- MATLAB & Simulink - MathWorks 中国
优先 级规则用来确定MATLAB 计算表达式时的运算顺序。 ... A = [3 9 5]; B = [2 1 5]; C = A./B.^2 C = 0.7500 9.0000 0.2000 C = (A./B).^2 C = 2.2500 81.0000 1.0000 ...
#70. b.將堆疊頂端指標top 設為-1
運算元(operand); 運算子(operator); Example: a^b-c+d*(e+f) 中. 運算元:a, b, c, d, e, f 運算子:^, -, +, *, (, ). 算術運算子之優先序(當沒有括號時尤其重要).
#71. 污染清理費用優先權之研究*
土壤及地下水污染整治法第四九條規定:「依第四十三條、. 第四十四條規定應繳納之費用,優先於一切債權及抵押權。」水污染防治法第七一. 條第一項規定:「地面水體發生污染 ...
#72. c語言運算子優先權 - Continen
這點是SQL 的標準,和C 語言的使用不太一樣的地方。註解會在進一步的語法分析前被消去,也可以方便地以空白字元替代。4.1.6. 運算優先權(Operator Precedence) Table 4.2 ...
#73. Ch04 - 介紹Objective-C 的運算式以及一些運算子 - Notes
(1) 指定運算子; (2) 加減乘除的順序(優先權); (3) 單元負號運算子 ... 若要說到運算子,最基本的大概就是指定運算子(Assignment operator)了,在我們 ...
#74. Python控制結構課程第四課-運算子優先順序一覽 - AI方程式
還不熟悉的人,這篇是你的救星阿!! 運算子優先順序(operator precedence)在包含Python 及其他的程式語言都是很重要的概念。它是數學運算 ...
#75. C programming. - ppt download - SlidePlayer
3 C語言的編譯流程載入階段執行階段compiler linker loader Source code Object code ... 8 Operator 的執行順序 Ex1 Ex2 Note: 先考量「優先權」再考量「結合性」.
#76. 所有的程式均可由三種控制結構寫成
條件運算子是C中唯一的三元運算子(ternary operator)-它使用了三個運算元。 這些運算元加上條件運算子構成了條件運算 ... 優先權順序是以表格的上方逐次往下遞減。
#77. 基本C 語言指標(Pointer) 使用 - BugWorkShop - 甲蟲工作室
用 & (取址運算子 Address-of operator) 取得變數的位址,用 * 間接參考指使用 ... 指標p所指到的記憶體上1,這是因為++和*優先權同樣為2,右結合, ...
#78. Verilog學習筆記基本語法篇(二)·········運算符 - ZenDei技術網 ...
最高優先順序別↓ ↓ ↓ ↓ 最低優先順序別(2)賦值運算符=,< . ... 摘要:今天我們結合代碼實例來具體看一下C#4.0中的四個比較重要的特性。 之前的文章中,我們曾介紹 ...
#79. [分享] 運算子優先順序?: 大於= 大於, - C_and_CPP | PTT Web
C++ Primer 4/e (P.170) 中,運算子優先序(Operator Precedence) 如下表: ?: ... 優先權高於assignment (=) 那就應該跟上次的分析過程相同,其運算 ...
#80. 【資料結構】堆疊 - 程式設計教育農場
Ž同優先權者,則由結合性,來決定是由左而右,還是由右而左執行。 【中序式→前序式】. 假設有一個中序式為:A×B+C×D, ...
#81. bash ARITHMETIC EVALUATION - 小蘿蔔工作室Little Robot ...
下列是運算子列表,以相同優先序為群組,越往下優先權越低(優先序 和C 語言一樣?)。括號裡的算式會先算。 ... expr?expr:expr, conditional operator.
#82. PDL程式開發手冊
假設所有的task的優先權都一樣時,當有n個task要執行,且不在sleep或stop ... 其中, * 為間接值運算子(indirect value operator), 只有在變數宣告 ...
#83. 優先度 - 台灣公司行號
優先度- 神奇寶貝百科,關於寶可夢的百科全書- 神奇宝贝百科 ... 2019年7月20日- 運算子優先權(C 語言)Percedence Table 運算子Operator 說明Description 結合 ...
#84. 資料結構: 堆疊應用與後序轉換 - Jinyo的隨便寫寫
在於比較運算子的優先權:左右括號 > 乘除 >加減 ... 運算子處理*/ void Operator(char ch,int number) { if(top==-1&&number!=RIGHT) /* 若堆疊為空 ...
#85. (C) 簡單搞懂指標(pointer)、指標陣列(pointers of array, int *foo
取值運算子(Dereference operator) - 在宣告以外時所有出現在變數前的都是這種(當然 ... 另外要注意++/--的位置,因為++/--的優先權(precedence)是高 ...
#86. 海事優先權:我國海商法之規範及其對國際公約之繼受
第一,就同一航次來看,海事優先權與船舶抵押權、留置權的位次是以下的. 關係:即A>B>C;以及D>E>F。 第二,就不同航次的海事優先權來比較,則是以下的關係:即A>D ...
#87. Chapter 7 Expressions and Assignment Statements - Coggle
operator overloading (運算子多載) ... 可讀性↓ (C++, Ada允許使用者自訂運算子多載) ... 說明: 在C-based語言中又被稱為casts (e.g. C : (int)angle).
#88. Jun Wu的教學網頁國立屏東大學資訊工程學系CSIE, NPTU
7.1.1 關係運算子/Relational Operator ... 7.1.3 邏輯運算子/Logical Operator ... 我們將目前為止介紹過的運算子之優先順序整理如table 5(表中是以優先權高至低依 ...
#89. Chap 3 基本資料型態
在同一個敘述內,當運算子的優先權相同時,則依照從左至右的順序處理。 37 /88. 整數的除法 ... (relational operators ). x != y. 不相等 != x == y. 相等. == c >= b.
#90. C++队列和优先权队列的使用---应用:带时限作业排序 - CSDN
C++队列和优先权队列的使用—应用实例:带时限作业排序. ... j = k; } T prof, loss; //当前结点X的下界函数c(X)=loss,上界函数u(X)=24-prof int j, ...
#91. terms of priority - 英中– Linguee词典
不過, 假如他們選擇自己駕車,他們所受懲罰應該只是損失使用道路的優先權和時間, ... (c) Inclusiveness: In terms of participants, priority should be given to ...
#92. RE:【理論VX教學】Ruby與RGSS2 - RPG製作大師 - 哈啦區
運算符號4-1優先權在以前學數學時就有教過當在式子中碰到乘號"*"或除號"/"時必須 ... (conditional operator) #問號判斷句 ... if a == b and c != d
#93. #分享估值順序(order of evaluation) - 軟體工程師板 | Dcard
0. 前綴遞增運算子(prefix increment operator) 的優先權高於+ - × / % 運算子[1],那應該要先做才對?a * 9 + (b + 7 % 2) - 20 * - C語言, ...
#94. 10/29/05 - Python 基礎實戰
運算子﹙operator﹚的功用是結合物件,組成運算式﹙expression﹚,以求算某 ... 事實上,你可以用小括弧改變表3.7內定的運算子優先權,例如,先乘除後 ...
#95. 程式中運算式的寫法分為中序前序後序 - 怪物獸誌
AND OR > < 是運算子operator , 變數a,B,C.. ... 在中譬如A+B , (A+B)*(C+D). 中序缺點: 有複雜的括號與運算浮號的優先權問題,電腦編譯器處理比較麻煩
#96. [Algorithm][C / C++] 中序轉後序,使用鏈結堆疊(Stack)實作
延續上一篇,[ALGORITHM][C / C++] 堆疊(STACK)練習這篇要將堆疊應用在中 ... 為空or 比較Stack的top operator 與value 的優先權 if (isEmpty(stack) ...
#97. 何谓堆叠(Stacks)_百度文库
運算式之計算原則優先權(precedence);運算子運算原則。 ... Data Structure: Stacks 8 單元運算子(Unary Operator) +(正號) - (負號) !(not) 二元運算子(Binary ...
#98. c421. pA 雲端列印
每個客戶依該年度所選擇服務等級及所繳交費用可有不同的列印優先權, 以1, ... _OUTC(_s,ALL(_c));} template<typename _a> ostream &operator ...
#99. 位元運算子 L
運算式組成元素(Expression); 各種運算子(Operators). 3. 運算式一般分為三類: ... 4 int a = 1, b = 1, c = 2, d = 2; ... 運算子運算優先權大小的比較表:.
c operator優先權 在 Re: [分享] 運算子優先順序?: 大於= 大於, - 看板C_and_CPP 的推薦與評價
本文完整收錄 purpose 君之原文,請詳細讀完原文再看我的回應。
※ 引述《purpose (purpose)》之銘言:
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 編譯錯誤。
不知道這樣理解對嗎?謝謝。
==============================================================================
請先詳細讀完上文,以下回應開始:
一點淺見與各位分享,若有錯誤請指正,並請海涵,謝謝。
先講結論:
(一)在 C99 中「=」的結果不是 lvalue,但 C++03 中卻是
lvalue,此結果導致「?:」運算子的傳回值也是不同的。
(二)若「A?B:C」中的 C 中含有「=」的時候,GCC C++
Compiler 會將整個敘述視為是 assignment-expression,而不是
範圍較小的 conditional-expression,也就是說「A?B:C」
如果是「1 ? varA = 1 : varB = 2 ;」,其中的敘述C是
「varB = 2」,而不是「varB」,但我個人認為這不符合程設邏輯
,如果有兩種選擇的話,編譯器應當選擇較小範圍感覺上較合理,
更何況「?:」運算子的順序還高過「=」運算子呢,這不知道算不
算 GCC 的 Bug?;另一方面,GCC C Compiler 則將
「1 ? varA = 1 : varB = 2 ;」中的敘述C視為「varB」,因此
整個敘述變成了先執行「?:」傳回了一個「不是lvalue」的值(注
意在 C++ 中傳回 lvalue!),然後將此值經由「=」賦予 2,然
而又因為此值不是 lvalue 因此編譯器回報錯誤(lvalue
required as left operand of assignment)。
<註>在 Wikipedia (2013/02/26) 的 Operators in C and C++ 條目提到:
----------------------------------------------------------------------
The binding of operators in C and C++ is specified (in the
corresponding Standards) by a factored language grammar, rather
than a precedence table. This creates some subtle conflicts.
For example, in C, the syntax for a conditional expression is:
logical-OR-expression ? expression : conditional-expression
while in C++ it is:
logical-OR-expression ? expression : assignment-expression
Hence, the expression:
e = a < d ? a++ : a = d
is parsed differently in the two languages.
In C, this expression is a syntax error, but many compilers
parse it as:
e = ((a < d ? a++ : a) = d)
which is a semantic error, since the result of the
conditional-expression (which might be a++) is not an lvalue.
In C++, it is parsed as:
e = (a < d ? a++ : (a = d))
which is a valid expression.
----------------------------------------------------------------------
(三)誠如 purpose 君所言,C++03 中提到「The precedence of
operators is not directly specified, but it can be derived
from the syntax.」,我想這就是造就第二點的原因。例如
「i=0, i++, i++;」,值得注意的是「++」運算子的順序高於「,」
運算子以及「=」運算子,但根據 C++03 的說法 i 應當是 2!
(四)個人認為在寫程式的時候,應當不要使用如此容易讓人疑惑,
甚至可能在某些實作環境也可能讓編譯器疑惑的語法;不才亦認為如
此作法並不會讓程式執行起來更快,因為編譯器的工作是將程式語言
敘述轉成機器碼,或許語法寫得複雜難懂,但結果卻跟簡單語法一樣
(何況現今許多編譯器都已經號稱有最佳化的功能了),所以這樣做
可說是得不償失,減少了移植性和可讀性、維護性。
(五)希望各位在討論這個主題的時候可以列出編譯的環境,因為在
各種實做環境說不定結果是不同的。
(六)以下提供兩個檔案,是我用以實驗的程式,請各位參考;註解
內是利用 GCC 4.7.2 編譯並執行的結果,並請有其他環境(MSVC,
IntelCompiler)的朋友提供執行結果,謝謝。
============ CODE START ============
/* ---------------------------------------------------------
* Description: the Usage of '?:' Operators ( C++ version )
* Author: ShaDer(ptt.cc) (aka. ShaD)
* License: General Public License version 2 (GPLv2)
* Compiler: C++ (gcc-4.7.2)
----------------------------------------------------------*/
#include <iostream>
using namespace std;
int main() {
int TelNum = +886-2-3366-3366; //-- This is NOT my number :)
cout << TelNum << "\n"; //-- output test: -5848
int a, b, c;
/*
a = 9, b = 10;
1 ? a = 99 : b = 1010;
cout << a << "\n"; // 99
cout << b << "\n"; // 10
*/
/*
a = 3, b = 4;
(1 ? a = 33 : b) = 44;
cout << a << "\n"; // 44(!!!)
cout << b << "\n"; // 4
*/
/*
a = 5, b = 6;
(1) ? (a = 55) : (b) = 66;
cout << a << "\n"; // 55
cout << b << "\n"; // 6
*/
/*
a = 7, b = 8;
1 ? (a = 77) : b = 88;
cout << a << "\n"; // 77
cout << b << "\n"; // 8
*/
/*
a = 5, b = 6, c = 1;
1 ? a = 55 : b = c++;
cout << a << "\n"; // 55
cout << b << "\n"; // 6
cout << c << "\n"; // 1
a = 5, b = 6, c = 1;
1 ? a = 55 : b = ++c;
cout << a << "\n"; // 55
cout << b << "\n"; // 6
cout << c << "\n"; // 1
*/
/*
a = 5, b = 6, c = 1;
(1 ? a = 55 : b) = (c++);
cout << a << "\n"; // 1
cout << b << "\n"; // 6
cout << c << "\n"; // 2
*/
/*
a = 5, b = 6, c = 1;
(1 ? a = 55 : b++) = (c++);
// Error: lvalue required as left operand of assignment
cout << a << "\n";
cout << b << "\n";
cout << c << "\n";
*/
/*
a = 5, b = 6, c = 1;
(1 ? a = 55 : (b++)) = (c++);
// Error: lvalue required as left operand of assignment
cout << a << "\n";
cout << b << "\n";
cout << c << "\n";
*/
return 0;
}
============= CODE END =============
============ CODE START ============
/* ---------------------------------------------------------
* Description: the Usage of '?:' Operators ( C version )
* Author: ShaDer(ptt.cc) (aka. ShaD)
* License: General Public License version 2 (GPLv2)
* Compiler: C/C++ (gcc-4.7.2)
----------------------------------------------------------*/
#include <stdio.h>
int main(void) {
int a, b;
a = 1, b = 2;
1 ? (a = 11) : (b = 22) ;
printf("a=%d, b=%d\n", a, b);
/* C: a = 11, b = 2 */
/* C++: a = 11, b = 2 */
a = 3, b = 4;
1 ? a = 33 : (b = 44) ;
printf("a=%d, b=%d\n", a, b);
/* C: a = 33, b = 4 */
/* C++: a = 33, b = 4 */
/**********************************************************************
| 敘述『(1 ? (a = 55) : b ) = 66;』不符合 C99 規則,但 C++03 則通過, |
| 原因應來自 assignment operators 在 C++03 的結果是 lvalue,但在 C99 |
| 卻不是 lvalue,此結果導致「?:」運算子的傳回值也是不同的。 |
**********************************************************************/
a = 5, b = 6;
(1 ? a = 55 : b ) = 66 ;
printf("a=%d, b=%d\n", a, b);
/* C: ERROR: lvalue required as left operand of assignment */
/* C++: a = 66, b = 6 */
a = 7, b = 8;
1 ? (a = 77) : b = 88 ;
printf("a=%d, b=%d\n", a, b);
/* C: ERROR: lvalue required as left operand of assignment */
/* C++: a = 77, b = 8 */
a = 9, b = 10;
1 ? a = 99 : b = 1010 ;
printf("a=%d, b=%d\n", a, b);
/* C: ERROR: lvalue required as left operand of assignment */
/* C++: a = 99, b = 10 */
return 0;
}
============= CODE END =============
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 111.251.73.137
※ 編輯: ShaDer 來自: 111.251.73.137 (02/26 11:02)
※ 編輯: ShaDer 來自: 111.251.73.137 (02/26 11:10)
※ 編輯: ShaDer 來自: 111.251.73.137 (02/26 11:15)
※ 編輯: ShaDer 來自: 111.251.73.137 (02/26 11:39)
... <看更多>