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 |