ตัวดำเนินการจะถูกใช้กับตัวแปรและค่าคงที่ในการดำเนินการบางอย่าง เช่น การดำเนินการทางคณิตศาสตร์ ในภาษา 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
Symbol | Name | Example |
---|---|---|
+ | Addition | c = a + b |
– | Subtraction | c = a – b |
* | Multiplication | c = a * b |
/ | Division | c = a / b |
% | Modulo | c = 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
Operator | Example | Equivalent 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 <<= 2 | a = 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 และตัวดำเนินการเปรียบเทียบ
Operater | Example | Result |
---|---|---|
== | a == b | true if `a` equal to `b`, otherwise false |
!= | a != b | true if `a` not equal to `b`, otherwise false |
< | a < b | true if `a` less than `b`, otherwise false |
> | a > b | true if `a` greater than `b`, otherwise false |
<= | a <= b | true if `a` less than or equal to `b`, otherwise false |
>= | a >= b | true 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
Name | Symbol | Example |
---|---|---|
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
Symbol | Name | Description |
---|---|---|
& | Bitwise AND | 1 ถ้าบิตทั้งคู่เป็น 1, ไม่เช่นนั้นเป็น 0 |
| | Bitwise inclusive OR | 1 ถ้าอย่างน้อยหนึงบิตเป็น 1, ไม่เช่นนั้นเป็น 0 |
^ | Bitwise exclusive OR | 1 ถ้าทั้งสองบิตแตกต่างกัน, ไม่เช่นนั้นเป็น 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 นักเรียนได้เรียนรู้และทำความเข้าใจในตัวดำเนินการประเภทต่างๆ และได้เห็นถึงตัวอย่างการใช้งานของตัวดำเนินการแต่ละรูปแบบ ซึ่งจะนำไปใช้ในการเขียนโปรแกรมในบทต่อๆ ไป