ตัวดำเนินการ

ตัวดำเนินการจะถูกใช้กับตัวแปรและค่าคงที่ในการดำเนินการบางอย่าง เช่น การดำเนินการทางคณิตศาสตร์ ในภาษา C มีตัวดำเนินการประเภทต่างๆ ที่ทำหน้าที่แตกต่างกันไป ในบทนี้ คุณจะได้เรียนรู้เกี่ยวกับตัวดำเนินการและตัวอย่างการใช้ตัวดำเนินการประเภทต่างๆ ในภาษา C

ข้างล่างนี้เป็นรายการของตัวดำเนินการในภาษา C

  • Assignment operator
  • Arithmetic operators
  • Compound assignment
  • Increment and decrement
  • Relational and comparison operators
  • Logical operators
  • Bitwise operators
  • Operator precedence

Assignment operator

ตัวดำเนินการกำหนดค่า ในภาษา C ใช้สัญลักษณ์เท่ากับ = มันถูกใช้เพื่อกำหนดค่าให้กับตัวแปรหรือค่าคงที่ ตัวดำเนินการจะมีสอง operand การทำงานของมันคือการนำค่าทางด้านขวาไปใส่ทางด้านซ้าย และ operand ทางด้านขวาสามารถเป็น expression ใดๆ

a = 2;
b = 3;
c = a + b;

ในตัวอย่างนี้ เราได้สร้างสามตัวแปรและกำหนดค่า 2 ให้กับตัวแปร a 3 ให้กับตัวแปร b และผลรวมของ a และ b ให้กับตัวแปร c ตามลำดับ

Arithmetic operators ( +, -, *, /, % )

ตัวดำเนินการทางคณิตศาสตร์ คือตัวดำเนินการที่ใช้เพื่อกระทำการดำเนินการทางคณิตศาสตร์ระหว่างตัวแปรหรือค่าคงที่ เช่น การบวก การลบ การคูณ และการหาร สำหรับในการเขียนโปรแกรมในภาษา C นั้นจะมีตัวดำเนินการสำหรับการหารเอาเศษ (Modulo) เพิ่มเข้ามา

ตารางข้างล่างนี้คือตัวดำเนินการทางคณิตศาสตร์ในภาษา C

SymbolNameExample
+Additionc = a + b
-Subtractionc = a - b
*Multiplicationc = a * b
/Divisionc = a / b
%Moduloc = a % b

จากในตารางของตัวดำเนินการข้างบน คุณน่าจะคุ้นเคยกับมันมาบ้างแล้วในการเรียนในวิชาคณิตศาสตร์ นอกจากตัวดำเนินการ Modulo ที่เป็นการหารเอาเศษ ต่อไปมาดูตัวอย่างการใช้ตัวดำเนินการทางคณิตศาสตร์ ในการเขียนโปรแกรมในภาษา C

#include <stdio.h>

int main () {
int a = 5;
int b = 10;
printf("a + b = %d\n", a + b);
printf("a - b = %d\n", a - b);
printf("a * b = %d\n", a * b);
printf("a / b = %d\n", a / b);
printf("a % b = %d\n", a % b);
return 0;
}

ในตัวอย่าง เป็นการใช้งานตัวดำเนินการประเภทต่างๆ ในภาษา C เราได้ประกาศตัวแปร a และ b และพร้อมกับกำหนดค่าให้กับมันและใช้ตัวดำเนินการต่างๆ ซึ่งคุณคงจะคุ้นเคยดี และในตัวดำเนินการ Modulo นั้นเป็นการหารเอาเศษซึ่งคำตอบที่ได้จะเป็นเศาของการหาร เมื่อรันโปรแกรม มันจะได้ผลลัพธ์ดังนี้

a + b = 15
a - b = -5
a * b = 50
a / b = 0
a % b = 5

Compound assignment (+=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |=)

Compound assignment คือตัวดำเนินการที่ใช้เพื่ออัพเดทหรือแก้ไขค่าปัจจุบันของตัวแปรโดยการกระทำทางคณิตศาสตร์และใช้ตัวดำเนินการกำหนดค่าร่วมด้วย ซึ่งตัวดำเนินการแบบ Compound assignment มักจะใช้เป็นรูปแบบสั้นของตัวดำเนินการทางคณิตศาสตร์และตัวดำเนินการระดับบิตเพื่อให้การเขียนสั้นลง

ข้างล่างนี้เป็นตารางของ compound assignment operators ในภาษา C

OperatorExampleEquivalent to
+=a += 2;a = a + 2
-=a -= 2;a = a - 2
*=a *= 2;a = a * 2
/=a /= 2;a= a / 2
%=a %= 2;a = a % 2
>>=a >>= 2;a = a >> 2
<<=a <<= 2a = a << 2
&=a & = 2;a = a & 2
^=a ^= 2;a= a ^ 2
|=a |= 2;a = a | 2

มาดูตัวอย่างของการใช้งานของตัวดำเนินการ compound assignment

#include <stdio.h>

int main () {
int x = 10;
int y = 2;
x += 10; //equivalent to x = x + 10
y -= 2; //equivalent to y = y - 2
printf("x = %d, y = %d", x, y);
return 0;
}

ในตัวอย่าง นั้นเป็นรูปแบบอย่างสั้นในการดำเนินการทางคณิตศาสตร์ของมัน โดยการทำงานของตัวดำเนินการจะอ้างอิงจากค่าเดิม เช่น ในตัวแปร x นั้นเป็นการบวกค่าเข้าไปในตัวแปรเดิมอีก 10 และในตัวแปร y นั้นเป็นการลบค่าออกจากตัวแปรเดิมออก 2 และมันจะได้ผลลัพธ์ดังนี้

x = 20, y = 0

Increment and decrement (++, --)

ตัวดำเนินการเพิ่มและลดค่า คือตัวดำเนินการที่ใช้เพื่อบวกหรือลบค่าออกจากตัวแปรโดย 1 โดยการเพิ่มเครื่องหมาย ++ หรือ-- ใส่ข้างหน้าหรือข้างหลังตัวแปร ซึ่งมีรูปแบบการใช้ดังนี้

identifier++

มาดูตัวอย่างของการใช้ตัวดำเนินการเพิ่มและลดค่า

#include <stdio.h>

int main () {
int a = 1;
int b = 10;
a++;
b--;
printf("a=%d, b=%d", a, b);
return 0;
}

เมื่อเรารันโปรแกรม นี่เป็นผลลัพธ์ที่เราจะได้

a=2, b=9

เหมือนที่คุณเห็นในตัวอย่าง มันเป็นรูปแบบอย่างสั้นของ a = a + 1 และ b = b - 1 มันมักจะใช้กับคำสั่ง for loop เพื่อเพิ่มของการรัน index หรือตำแหน่ง index ของอาเรย์

และยังมีรูปแบบอื่นของตัวดำเนินการนี้คือ prefix เช่น ++a --b โดยมันหมายถึงจะมีการเพิ่มหรือลดค่าก่อนที่จะมีการประมวลผลคำสั่งปัจจุบัน

Relational และ comparison operators ( ==, !=, >, <, >=, <= )

ตัวดำเนินการความสัมพันธ์และเปรียบเทียบ คือตัวดำเนินการที่ถูกใช้เพื่อประเมินค่า true และ false ระหว่างสองตัวถูกดำเนินการ ซึ่งขึ้นกับเงื่อนไขและความสัมพันธ์ของมัน

ข้างล่างนี้เป็นรายการของตัวดำเนินการ relational และตัวดำเนินการเปรียบเทียบ

OperaterExampleResult
==a == btrue if a equal to b, otherwise false
!=a != btrue if a not equal to b, otherwise false
<a < btrue if a less than b, otherwise false
>a > btrue if a greater than b, otherwise false
<=a <= btrue if a less than or equal to b, otherwise false
>=a >= btrue if a greater than or equal to b, otherwise false

ตัวดำเนินการเหล่านี้ถูกใช้ เช่น เพื่อเปรียบเทียบค่าระหว่างตัวแปรว่าเท่ากันหรือไม่ หรือเปรียบการมากกว่าน้อยกว่าหรือค่าในตัวแปร และผลลัพธ์ของการเปรียบเทียบจะเป็น true และ false

#include <stdio.h>

int main () {
int a = 5;
int b = 10;

if (a == b) {
printf ("a and b are equal");
} else {
printf ("a and b are not equal");
}

return 0;
}

ในตัวอย่าง เป็นโปรแกรมในการเปรียบเทียบค่าในตัวแปร a และ b โดยการใช้คำสั่ง if ซึ่งถ้าหากค่าของตัวแปรทั้งสองเท่ากันซึ่งจะทำให้เงื่อนไขเป็นจริง จะทำให้โปรแกรทำงานในบล็อคของคำสั่ง if ไม่เช่นนั้นโปรแกรมจะทำในบล็อคของคำสั่ง else แทน

a and b are not equal

นี่เป็นผลลัพธ์การทำงานของโปรแกรม จะเห็นว่าโปรแกรมทำงานในบล็อคของคำสั่ง else เพราะว่าค่าในตัวแปรทั้งสองนั้นไม่เท่ากัน ให้คุณลองเปลี่ยนค่าในตัวแปรให้เท่ากันแล้วลองรันโปรแกรมอีกครั้งเพื่อดูผลลัพธ์

Logical operators ( !, &&, || )

ตัวดำเนินการทางตรรกศาสตร์ถูกใช้เพื่อประเมิน expression ย่อยหลายๆ expression ให้เหลือเพียงอันเดียว โดยผลลัพธ์สุดท้ายนั้นจะเป็นจริงหรือเท็จ

ข้างล่างนี้เป็นรายการตัวดำเนินการทางตรรกศาสตร์ในภาษา C

NameSymbolExample
not!!a
and&&a && b
or||a || b

ในการทำงานของตัวดำเนินการนั้น ตัวดำเนินการ Not จะกลับค่าของ Boolean expression ตัวดำเนินการ and ทำการเชื่อมสอง expression เข้าด้วยกัน โดยจะได้ผลลัพธ์เป็นจริงหากทั้งสองค่าเป็นจริง ไม่เช่นนั้นจะเป็นเท็จ และตัวดำเนินการ or เชื่อมสอง expression เข้าด้วยกัน โดยจะได้ผลลัพธ์เป็นจริงหากมีอย่างน้อยหนึ่ง expression ที่เป็นจริง ไม่เช่นนั้นจะเป็นเท็จ ต่อไปมาดูตัวอย่างการใช้งานของตัวดำเนินการตรรกศาสตร์

#include <stdio.h>

int main() {
int a = 10;
bool b = 1;
bool c = 0;

// using "not" operator
if(!(a == 10))
printf("a is not equal to 10.\n");
else
printf("a is equal to 10.\n");

// using "and" operator
if(b && c)
printf("True.\n");
else
printf("False.\n");

// using "or" operator
if(b || c)
printf("True.\n");
else
printf("False.\n");

return 0;
}

ในตัวอย่างเรามีตัวแปรสามตัว ตัวแปร a เป็น integer ในขณะที่ตัวแปร b และ c เป็น boolean ในภาษา C ค่าของ boolean ที่เป็นจริงนั้นจะมีค่าเป็น 1 และเท็จจะเป็น 0

และนี่คือผลลัพธ์ของโปรแกรม

a is equal to 10.
False.
True.

Bitwise operators ( &, |, ^, ~, <<, >> )

Bitwise operators นั้นถูกใช้ในการดำเนินการระดับบิตของตัวแปรหรือข้อมูล มันมีประโยชน์มากในการเขียนโปรแกรมระดับต่ำ ตัวดำเนินการ Bitwise นั้นใช้หลักการทำงานเหมือนกับตัวดำเนินการทางตรรกศาสตร์ โดยใช้ 1 สำหรับค่าจริงและ 0 สำหรับค่าเท็จ

นี่เป็นรายการของตัวดำเนินการ Bitwise ในภาษา C

SymbolNameDescription
&Bitwise AND1 ถ้าบิตทั้งคู่เป็น 1, ไม่เช่นนั้นเป็น 0
|Bitwise inclusive OR1 ถ้าอย่างน้อยหนึงบิตเป็น 1, ไม่เช่นนั้นเป็น 0
^Bitwise exclusive OR1 ถ้าทั้งสองบิตแตกต่างกัน, ไม่เช่นนั้นเป็น 0
~bit inversionกลับบิตจาก 1 เป็น 0 และในทางตรงข้าม
<<Shift bits leftเลื่อนบิตไปทางซ้าย เติมบิต 0 ทางขวา
>>Shift bits rightเลื่อนบิตไปทางขวา เติมบิต 0 ทางซ้าย

จากตารางข้างบน เป็นตัวดำเนินการประเภทต่างๆ ในภาษา C ที่ใช้ดำเนินการกับข้อมูลในระดับบิต ยกตัวอย่าง เช่น เมื่อเรากำหนดค่าให้กับตัวแปรนั้น คอมพิวเตอร์จะเก็บข้อมูลในรูปแบบของเลขฐานสอง (binary) ตัวดำเนินการเหล่านี้ใช้สำหรับจัดการกับข้อมูลดังกล่าว มาดูตัวอย่างการใช้งานในภาษา C

#include <stdio.h>

int main () {
int a = 2; // 00000010
int b = 5; // 00000101
printf("a & b = %d\n", a & b); // 00000000 = 0
printf("a & b = %d\n", a | b); // 00000111 = 7
printf("~a = %d\n", ~a); // 11111101 = -1
printf("a >> 1 = %d\n", a >> 1); // 00000001 = 1
printf("a << 1 = %d\n", a << 1); // 00000100 = 8
return 0;
}

ในตัวอย่าง เป็นโปรแกรมในการใช้งานตัวดำเนินการระดับบิตกับการจัดการข้อมูลประเภท Integer เราได้ประกาศตัวแปร a และ b และได้คอมเมนต์ค่าของ binary ที่ถูกเก็บไว้ในหน่วยความจำ การทำงานของตัวดำเนินการ & และ | นั้นทำงานกับคู่ของแต่ละบิตของตัวแปรทั้งสอง ส่วนอีกสามตัวดำเนินการที่เหลือนั้นกระทำกับตัวแปรเดียว ในตัวดำเนินการ ~ นั้นเป็นการกลับบิต และสำหรับตัวดำเนินการ bit shift นั้นเมื่อเลื่อนบิตไปทางซ้ายจะทำให้ค่าเพิ่มขึ้นสองเท่า และเมื่อเลื่อนบิตไปทางขวาก็จะทำให้ค่าลดลงสองเท่า

a & b = 0
a & b = 7
~a = -3
a >> 1 = 1
a << 1 = 4

นี่เป็นผลลัพธ์การทำงานของโปรแกรมของการใช้งานตัวดำเนินการระดับบิตในภาษา C

Operator precedence

ลำดับความสำคัญของตัวดำเนินการ (Operator precedence) ใช้เพื่อกำหนดว่าตัวดำเนินการใช้ที่จะถูกทำงานก่อน ยกตัวอย่างเช่น ในการทำงานของ expression 6 + 3 * 4 นั้นจะได้ผลลัพธ์เป็น 18 เพราะว่าตัวดำเนินการ * นั้นมีความสำคัญมากกว่าตัวดำเนินการ + คุณสามารถบังคับให้การบวกทำงานก่อนได้โดยใช้วงเล็บ (6 + 3) * 4 เพื่อให้การบวกสามารถทำงานก่อนได้ ซึ่งจะได้ผลลัพธ์เป็น 36 เป็นต้น

ข้างล่างนี้ เป็นตารางแสดงลำดับความสำคัญของตัวดำเนินการในภาษา C

Operator Name Associativity Operators
Primary left to right ()[].
Unary ขวาไปซ้าย ++--+-!~&*(type_name)sizeof new delete
Multiplicative ซ้ายไปขวา */%
Additive ซ้ายไปขวา +-
Bitwise Shift ซ้ายไปขวา <<>>
Relational ซ้ายไปขวา <><=>=
Equality ซ้ายไปขวา ==!=
Bitwise AND ซ้ายไปขวา &
Bitwise Exclusive OR ซ้ายไปขวา ^
Bitwise Inclusive OR ซ้ายไปขวา |
Logical AND ซ้ายไปขวา &&
Logical OR ซ้ายไปขวา ||
Conditional ขวาไปซ้าย ?:
Assignment ขวาไปซ้าย =+=-=*= /=<<=>>= %= &=^=|=
Comma ซ้ายไปขวา ,

ในบทนี้ เราได้ครอบคลุมการดำเนินการพื้นฐานในภาษา C คุณได้เรียนรู้และทำความเข้าใจในตัวดำเนินการประเภทต่างๆ และได้เห็นถึงตัวอย่างการใช้งานของตัวดำเนินการแต่ละรูปแบบ ซึ่งจะนำไปใช้ในการเขียนโปรแกรมในบทต่อๆ ไป