Operators ตัวดำเนินการ ภาษา C คือสัญลักษณ์ที่บอกให้คอมไพเลอร์ดำเนินการฟังก์ชันทางคณิตศาสตร์หรือตรรกะที่เฉพาะเจาะจง ภาษาซีมีโอเปอเรเตอร์ในตัวมากมายและมีโอเปอเรเตอร์ประเภทต่อไปนี้ −
- Arithmetic Operators (ตัวดำเนินการคณิตศาสตร์)
- Relational Operators (ตัวดำเนินการแบบสัมพันธ์)
- Logical Operators (ตัวดำเนินการทางตรรกะ)
- Bitwise Operators (ตัวดำเนินการแบบบิต)
- Assignment Operators (ตัวดำเนินการกำหนดค่า)
- Misc Operators (ตัวดำเนินการกำหนดค่าแบบผสม)
ในบทนี้ เราจะพิจารณาถึงวิธีการทำงานของโอเปอเรเตอร์แต่ละตัว
Arithmetic Operators (ตัวดำเนินการคณิตศาสตร์)
ตารางต่อไปนี้แสดงตัวดำเนินการเลขคณิตทั้งหมดที่รองรับโดยภาษา C สมมติว่าตัวแปร A มีค่า 10 และตัวแปร B มีค่าเท่ากับ 20 จากนั้น −
| โอเปอเรเตอร์ | คำอธิบาย | ตัวอย่าง |
|---|---|---|
| + | บวก (Addition) | A + B = 30 |
| − | ลบ (Subtraction) | A − B = -10 |
| * | คูณ (Multiplication) | A * B = 200 |
| / | หาร (Division) | B / A = 2 |
| % | หารเอาผลลัพธ์เฉพาะเศษ (Modulus) | B % A = 0 |
| ++ | เพิ่มค่าจำนวนเต็มทีละหนึ่ง | A++ = 11 |
| — | ลดค่าจำนวนเต็มทีละหนึ่ง | A– = 9 |
Relational Operators (ตัวดำเนินการแบบสัมพันธ์)
ตารางต่อไปนี้แสดงตัวดำเนินการเชิงสัมพันธ์ทั้งหมดที่รองรับโดย C สมมติว่าตัวแปร A มีค่า 10 และตัวแปร B มีค่าเท่ากับ 20:
| โอเปอเรเตอร์ | คำอธิบาย | ตัวอย่าง |
|---|---|---|
| == | ตรวจสอบว่าค่าของตัวถูกดำเนินการสองตัวเท่ากันหรือไม่ ถ้าใช่ เงื่อนไขจะกลายเป็นจริง | (A == B) ไม่เป็นความจริง |
| != | ตรวจสอบว่าค่าของตัวถูกดำเนินการสองตัวเท่ากันหรือไม่ หากค่าไม่เท่ากัน เงื่อนไขจะกลายเป็นจริง | (A != B) เป็นจริง |
| > | ตรวจสอบว่าค่าของตัวถูกดำเนินการทางซ้ายมากกว่าค่าของตัวถูกดำเนินการทางขวาหรือไม่ ถ้าใช่ เงื่อนไขจะกลายเป็นจริง | (A > B) ไม่เป็นความจริง |
| < | ตรวจสอบว่าค่าของตัวถูกดำเนินการทางซ้ายน้อยกว่าค่าของตัวถูกดำเนินการทางขวาหรือไม่ ถ้าใช่ เงื่อนไขจะกลายเป็นจริง | (A < B) เป็นจริง |
| >= | ตรวจสอบว่าค่าของตัวถูกดำเนินการทางซ้ายมากกว่าหรือเท่ากับค่าของตัวถูกดำเนินการทางขวาหรือไม่ ถ้าใช่ เงื่อนไขจะกลายเป็นจริง | (A >= B) ไม่เป็นความจริง |
| <= | ตรวจสอบว่าค่าของตัวถูกดำเนินการทางซ้ายน้อยกว่าหรือเท่ากับค่าของตัวถูกดำเนินการทางขวาหรือไม่ ถ้าใช่ เงื่อนไขจะกลายเป็นจริง | (A <= B) เป็นจริง |
Logical Operators (ตัวดำเนินการทางตรรกะ)
ตารางต่อไปนี้แสดงตัวดำเนินการเชิงตรรกะทั้งหมดที่สนับสนุนโดยภาษา C สมมติว่าตัวแปร A มีค่า 1 และตัวแปร B มีค่า 0 แล้ว −
| โอเปอเรเตอร์ | คำอธิบาย | ตัวอย่าง |
|---|---|---|
| && | และ (and) จะให้ผลลัพธ์เป็นจริงเมื่อเงื่อนไขทั้งสองเป็นจริง แต่ถ้าเงื่อนไขใดเป็นเท็จ หรือทั้งสองเงื่อนไขเป็นเท็จจะทำให้ผลลัพธ์เป็นเท็จ | (A && B) เป็นเท็จ |
| || | หรือ (or) จะให้ผลลัพธ์เป็นจริงเมื่อเงื่อนไขใดเงื่อนไขหนึ่งเป็นจริง หรือเป็นจริงทั้งสองเงื่อนไข แต่ถ้าเป็นเท็จทั้งสองเงื่อนไขจะทำให้ผลลัพธ์เป็นเท็จ | (A || B) เป็นจริง |
| ! | ไม่ใช่ (not) จะให้ผลลัพธ์เป็นจริงเมื่อเงื่อนไขหลัง not เป็นเท็จ แต่ถ้าเงื่อนไขหลัง not เป็นจริงจะทำให้ผลลัพธ์เป็นเท็จ | !(A && B) เป็นจริง |
Bitwise Operators (ตัวดำเนินการแบบบิต)
ตัวดำเนินการ Bitwise ทำงานบนบิตและดำเนินการแบบทีละบิต ตารางความจริงของ &, |, และ ^ มีดังต่อไปนี้ −
| p | q | p & q | p | q | p ^ q |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
| 1 | 0 | 0 | 1 | 1 |
สมมติว่า A = 60 และ B = 13 ในรูปแบบไบนารี จะเป็นดังนี้ −
A = 0011 1100
B = 0000 1101
—————–
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
~A = 1100 0011
ตารางต่อไปนี้แสดงรายการตัวดำเนินการระดับบิตที่รองรับโดย C สมมติว่าตัวแปร ‘A’ มีค่า 60 และตัวแปร ‘B’ มีค่าเท่ากับ 13 ดังนั้น:
| โอเปอเรเตอร์ | คำอธิบาย | ตัวอย่าง |
|---|---|---|
| & | ไบนารีและตัวดำเนินการคัดลอกบิตไปยังผลลัพธ์หากมีอยู่ในตัวถูกดำเนินการทั้งสอง | (A & B) = 12 คือ 0000 1100 |
| | | Binary OR Operator คัดลอกบิตหากมีอยู่ในตัวถูกดำเนินการอย่างใดอย่างหนึ่ง | (A | B) = 61 เช่น 0011 1101 |
| ^ | Binary XOR Operator คัดลอกบิตหากตั้งค่าไว้ในตัวถูกดำเนินการตัวเดียว แต่ไม่ใช่ทั้งสองอย่าง | (A ^ B) = 49 เช่น 0011 0001 |
| ~ | ตัวดำเนินการเสริมของ Binary One เป็นแบบเอกพจน์และมีเอฟเฟกต์ของการ ‘พลิก’ บิต | (~A ) = ~(60) เช่น -0111101 |
| << | ตัวดำเนินการ Shift ซ้ายไบนารี ค่าตัวถูกดำเนินการทางซ้ายจะถูกย้ายไปทางซ้ายตามจำนวนบิตที่ระบุโดยตัวถูกดำเนินการทางขวา | A << 2 = 240 คือ 1111 0000 |
| >> | ตัวดำเนินการ Shift ขวาแบบไบนารี ค่าตัวถูกดำเนินการทางซ้ายจะถูกย้ายไปทางขวาตามจำนวนบิตที่ระบุโดยตัวถูกดำเนินการทางขวา | A >> 2 = 15 คือ 0000 1111 |
Assignment Operators (ตัวดำเนินการกำหนดค่า)
ตารางต่อไปนี้แสดงรายการตัวดำเนินการมอบหมายที่รองรับโดยภาษา C
| โอเปอเรเตอร์ | คำอธิบาย | ตัวอย่าง |
|---|---|---|
| = | ตัวดำเนินการมอบหมายอย่างง่าย กำหนดค่าจากตัวถูกดำเนินการด้านขวาไปยังตัวถูกดำเนินการด้านซ้าย | C = A + B จะกำหนดค่าของ A + B ให้กับ C |
| += | ตัวดำเนินการเพิ่ม AND เพิ่มตัวถูกดำเนินการทางขวาให้กับตัวถูกดำเนินการทางซ้าย และกำหนดผลลัพธ์ให้กับตัวถูกดำเนินการทางซ้าย | C += A เท่ากับ C = C + A |
| -= | ตัวดำเนินการลบและมอบหมาย มันลบตัวถูกดำเนินการทางขวาออกจากตัวถูกดำเนินการทางซ้าย และกำหนดผลลัพธ์ให้กับตัวถูกดำเนินการทางซ้าย | C -= A เทียบเท่ากับ C = C – A |
| *= | ตัวดำเนินการคูณและมอบหมาย มันคูณตัวถูกดำเนินการทางขวาด้วยตัวถูกดำเนินการทางซ้าย และกำหนดผลลัพธ์ให้กับตัวถูกดำเนินการทางซ้าย | C *= A เท่ากับ C = C * A |
| /= | ตัวดำเนินการแบ่ง AND มันแบ่งตัวถูกดำเนินการทางซ้ายด้วยตัวถูกดำเนินการทางขวา และกำหนดผลลัพธ์ให้กับตัวถูกดำเนินการทางซ้าย | C /= A เท่ากับ C = C / A |
| %= | โมดูลัสและตัวดำเนินการกำหนด มันใช้โมดูลัสโดยใช้ตัวถูกดำเนินการสองตัวและกำหนดผลลัพธ์ให้กับตัวถูกดำเนินการทางซ้าย | C %= A เท่ากับ C = C % A |
| <<= | กะซ้ายและตัวดำเนินการมอบหมาย | C <<= 2 เหมือนกับ C = C << 2 |
| >>= | กะขวาและตัวดำเนินการมอบหมาย | C >>= 2 เหมือนกับ C = C >> 2 |
| &= | ตัวดำเนินการกำหนดระดับบิตและ | C &= 2 เหมือนกับ C = C & 2 |
| ^= | Bitwise เอกสิทธิ์ OR และตัวดำเนินการมอบหมาย | C ^= 2 เหมือนกับ C = C ^ 2 |
| |= | Bitwise รวม OR และตัวดำเนินการมอบหมาย | C |= 2 เหมือนกับ C = C | 2 |
Misc Operators ↦ sizeof & ternary
นอกจากตัวดำเนินการที่กล่าวถึงข้างต้น ยังมีตัวดำเนินการที่สำคัญอื่น ๆ อีกสองสามตัวรวมถึง sizeof และ ? :รองรับโดยภาษาซี
| โอเปอเรเตอร์ | คำอธิบาย | ตัวอย่าง |
|---|---|---|
| sizeof() | ส่งกลับขนาดของตัวแปร | sizeof(a) โดยที่ a เป็นจำนวนเต็มจะส่งกลับ 4 |
| & | ส่งกลับที่อยู่ของตัวแปร | &NS; ส่งคืนที่อยู่จริงของตัวแปร |
| * | ตัวชี้ไปยังตัวแปร | *NS; |
| ? : | นิพจน์เงื่อนไข | ถ้า Condition เป็นจริง ? แล้วค่า X : มิฉะนั้นค่า Y |
ลำดับความสำคัญของตัวดำเนินการในC
ลำดับความสำคัญของตัวดำเนินการจะกำหนดการจัดกลุ่มของคำในนิพจน์และตัดสินใจว่าจะประเมินนิพจน์อย่างไร ตัวดำเนินการบางตัวมีลำดับความสำคัญสูงกว่าตัวดำเนินการอื่น ตัวอย่างเช่น ตัวดำเนินการคูณมีลำดับความสำคัญสูงกว่าตัวดำเนินการบวก
ตัวอย่างเช่น x = 7 + 3 * 2; ในที่นี้ x ถูกกำหนดเป็น 13 ไม่ใช่ 20 เนื่องจากตัวดำเนินการ * มีลำดับความสำคัญสูงกว่า + ดังนั้นก่อนอื่นจะถูกคูณด้วย 3*2 แล้วบวกเข้ากับ 7
ในที่นี้ ตัวดำเนินการที่มีลำดับความสำคัญสูงสุดจะปรากฏที่ด้านบนสุดของตาราง ตัวดำเนินการที่มีค่าต่ำสุดจะปรากฏที่ด้านล่าง ภายในนิพจน์ ตัวดำเนินการที่มีลำดับความสำคัญสูงกว่าจะได้รับการประเมินก่อน
| Category | Operator | Associativity |
|---|---|---|
| Postfix | () [] -> . ++ – – | Left to right |
| Unary | + – ! ~ ++ – – (type)* & sizeof | Right to left |
| Multiplicative | * / % | Left to right |
| Additive | + – | Left to right |
| Shift | << >> | Left to right |
| Relational | < <= > >= | Left to right |
| Equality | == != | Left to right |
| Bitwise AND | & | Left to right |
| Bitwise XOR | ^ | Left to right |
| Bitwise OR | | | Left to right |
| Logical AND | && | Left to right |
| Logical OR | || | Left to right |
| Conditional | ?: | Right to left |
| Assignment | = += -= *= /= %=>>= <<= &= ^= |= | Right to left |
| Comma | , | Left to right |