สอน C++: การคำนวณทางคณิตศาสตร์เบื้องต้น บวก ลบ คูณ หาร ยกกำลัง
ตัวดำเนินการ
- Assignment operator
- Arithmetic operators
- Compound assignment operators
- Increment and decrement
- Comparison operators
- Logical operators
- Conditional ternary operator
- Bitwise operators
- Explicit type casting operator
- Operator precedence
Assignment operator
ตัวดำเนินการกำหนดค่านั้นแสดงโดยใช้เครื่องหมายเท่ากับ (=) มันถูกใช้เพื่อกำหนดค่าข้อมูลให้กับตัวแปรหรือค่าคงที่ในภาษา C++ ในการใช้งานตัวดำเนินการนั้นจะเป็นการนำค่าทางด้านขวาของตัวดำเนินการ กำหนดให้กับตัวแปรทางด้านซ้าย นี่เป็นตัวอย่างการใช้งาน
x = 10;
y = x;
a = b = c = 1;
ในตัวอย่าง เรามีตัวแปรสองตัวคือ
x
และ y
เราได้กำหนดค่า 10
ให้กับตัวแปร x
และเรากำหนดค่าของ x
ให้กับตัวแปร y
ดังนั้นทั้งตัวแปร x
และ y
จะมีค่าเป็น 10
และในคำสั่งสุดท้ายเป็นการกำหนดค่าให้กับหลายตัวแปรแบบในบรรทัดเดียว ซึ่งทั้งตัวแปร a
b
และ c
นั้นต่างก็มีค่าเท่ากับ 1
Arithmetic operators ( +, -, *, /, % )
ตัวดำเนินการคณิตศาสตร์ ถูกใช้เพื่อดำเนินการเกี่ยวกับทางคณิตระหว่างตัวแปรและค่าคงที่ เช่น การบวก การลบ การคูณ และการหาร และนอกจากนี้ตัวดำเนินการในการเขียนโปรแกรมคอมพิวเตอร์นั้น ยังมีตัวดำเนินการสำหรับการหารเอาเศษ (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 |
ในตารางข้างบน เป็นสัญลักษณ์ ชื่อ และตัวอย่างการใช้งานของตัวดำเนินการ ต่อไปมาดูตัวอย่างของการใช้ตัวดำเนินการทางคณิตศาสตร์
#include <iostream>
using namespace std;
int main()
{
int a = 3;
int b = 2;
cout << "a + b = " << a + b << endl;
cout << "a - b = " << a - b << endl;
cout << "a * b = " << a * b << endl;
cout << "a / b = " << a / b << endl;
cout << "a % b = " << a % b << endl;
return 0;
}
ในตัวอย่าง เป็นการใช้งานตัวดำเนินการทางคณิตศาสตร์ประเภทต่างๆ เราได้ประกาศตัวแปร
a
และ b
และกำหนดค่าให้กับตัวแปร ใน 4 คำสั่งแรกเป็นการกระทำทางคณิตศาสตร์พื้นฐานคือ การบวก การลบ การคูณ และการหาร ตามลำดับ แต่ในตัวดำเนินการสุดท้าย %
หรือการหารเอาเศษ ในตัวอย่าง 3 หาร 2 นั้นได้เศษ 1 ดังนั้นคำตอบจึงเป็น 1 และเมื่อโปรแกรมรัน มันจะให้ผลลัพธ์ดังต่อไปนี้a + b = 5
a - b = 1
a * b = 6
a / b = 1
a % b = 1
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 นั้นจะเป็นการรวมกันระหว่างตัวดำเนินการกำหนดค่าและตัวดำเนินการทางคณิตศาสตร์หรือตัวดำเนินการระดับบิต และมันสามารถใช้แทนตัวดำเนินการเหล่านั้นได้ในบางกรณีเพื่อทำให้การเขียนของคุณสั้นลง มาดูตัวอย่างการใช้งานในภาษา C++
#include <iostream>
using namespace std;
int main()
{
// Using compound assessment
// Building construction
int floor = 0;
cout << "Building construction" << endl;
floor += 4;
cout << "First day build 4 floors" << endl;
cout << floor << " floors has been constructed" << endl;
floor += 3;
cout << "Second day build 3 floors" << endl;
cout << floor << " floors has been constructed" << endl;
floor += 3;
cout << "Third day build 3 floors" << endl;
cout << floor << " floors has been constructed" << endl;
// No using compound assessment
// Fuel using of vehicle
float current_fuel = 100;
cout << "\nVehicle has 100% of fuel" << endl;
current_fuel = current_fuel - 17.2; // current_fuel -= 17.2;
cout << "Fuel left " << current_fuel << "%" << endl;
current_fuel = current_fuel - 20; // current_fuel -= 20;
cout << "Fuel left " << current_fuel << "%" << endl;
current_fuel = current_fuel + 35; // current_fuel += 35;
cout << "Fuel left " << current_fuel << "%" << endl;
current_fuel = current_fuel - 46.1; // current_fuel -= 46.1;
cout << "Fuel left " << current_fuel << "%" << endl;
return 0;
}
ในตัวอย่าง เป็นการใช้งานตัวดำเนินการ Compound assignment ในการเขียนโปรแกรมแสดงความคืบหน้าของการสร้างตึกและการใช้งานเชื้อเพลิงในถังของยานพาหนะ ในการสร้างตึกนั้นเรามีตัวแปร
floor
สำหรับเก็บค่าว่าสร้างตึกไปได้กี่ชั้นแล้ว ในแต่ละวันที่สร้างเสร็จ เราจะทำการบวกจำนวนชั้นที่สร้างเสร็จเพิ่มขึ้นจากค่าเดิมด้วยตัวดำเนินการ +=
และในตัวอย่างของการเชื้อเพลงนั้น เป็นการแสดงให้เห็นว่าเราสามารถที่จะใช้ตัวดำเนินการ Compound assignment เพื่อทำให้คำสั่งสั้นลงได้ ซึ่งไม่มีผลต่างกันในการทำงาน
Building construction
First day build 4 floors
4 floors has been constructed
Second day build 3 floors
7 floors has been constructed
Third day build 3 floors
10 floors has been constructed
Vehicle has 100% of fuel
Fuel left 82.8%
Fuel left 62.8%
Fuel left 97.8%
Fuel left 51.7%
นี่เป็นผลลัพธ์การทำงานเมื่อรันโปรแกรม
Increment และ decrement (++, --)
ตัวดำเนินการ Increment และ Decrement operators ถูกใช้เพื่อเพิ่มหรือลดค่าของตัวแปรทีละ 1 ตัวดำเนินการดำเนินการกับตัวแปรโดยการเพิ่ม
++
หรือ --
หลังจากตัวแปร นี่เป็นตัวอย่าง#include <iostream>
using namespace std;
int main()
{
int x = 1;
int y = 5;
x++;
++x;
y--;
cout << "x = " << x << endl;
cout << "y = " << y << endl;
return 0;
}
โปรแกรมจะมีผลลัพธ์ตามนี้
x = 3
y = 4
ตัวดำเนินการนี้เป็นรูปย่อของ
x = x + 1
เหมือนที่คุณได้เห็นในโปรแกรม อย่างไรก็ตามมันมีข้อแตกต่างระหว่าง Prefix และ Postfix increments โดย x++
จะต้องเสร็จสิ้นคำสั่งปัจจุบันก่อนที่จะเพิ่มค่า 1 ไปยังตัวแปร x
แต่ ++x
จะเพิ่มค่า 1 ไปยังตัวแปร x
ก่อนที่คำสั่งจะทำงาน
นอกจากนี้ การใช้งานตัวดำเนินการลบและเพิ่มที่ค่าเราใช้บ่อยๆ ในการเขียนโปรแกรมคือการใช้กับคำสั่งวนซ้ำ เพื่อเป็นตัวควบคุมการทำงานของลูป ต่อไปเป็นตัวอย่างของโปรแกรมแสดงตัวเลขด้วยคำสั่ง
while
loop#include <iostream>
using namespace std;
int main()
{
int i = 1;
int j = 1;
while (i <= 10)
{
cout << "i = " << i++ << ", j = " << ++j << endl;
}
return 0;
}
ในตัวอย่าง เป็นการใช้คำสั่ง
while
loop วนเป็นจำนวน 10 รอบสำหรับการแสดงตัวเลข เรามีตัวแปร i
และ j
ซึ่งถูกกำหนดค่าเป็น 1
ในตอนเริ่มต้น ในคำสังการแสดงผล cout
คุณจะเห็นว่าในตัวแปร i
เราแสดงผลโดยรูปแบบ Postfix i++
และในตัวแปร j
เราแสดงผลโดยรูปแบบ Prefix ++j
ทำให้ค่าของ j
นั้นถูกเพิ่มขึ้นก่อนที่จะแสดงผลi = 1, j = 2
i = 2, j = 3
i = 3, j = 4
i = 4, j = 5
i = 5, j = 6
i = 6, j = 7
i = 7, j = 8
i = 8, j = 9
i = 9, j = 10
i = 10, j = 11
นี่เป็นผลลัพธ์การทำงานของโปรแกรม ซึ่งคุณได้เห็นความแตกต่างอย่างชัดเจนระหว่างการใช้งานตัวเพิ่มลดค่าแบบ Prefix และ Posfix
Relational และ comparison operators ( ==, !=, >, <, >=, <= )
ตัวดำเนินการเปรียบเทียบถูกใช้ในการดำเนินการเปรียบเทียบระหว่างตัวแปร ผลลัพธ์ของตัวดำเนินการเหล่านี้จะมีแค่
true
และ false
อีกนัยหนึ่ง มันเป็นการเขียนโปรแกรมแบบมีเงื่อนไข ที่ใช้ในคำสั่งที่มีการเปรียบเทียบ เช่น if
, for
, while
และ do while
เป็นต้นRelational and comparison operators table
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 |
มาดูตัวอย่างในหารใช้งานสำหรับการเปรียบเทียบค่า
int n = 5;
if (n == 5)
{
cout << "n equal to 5";
}
นี่เรียกว่าคำสั่งเปรียบเทียบเงื่อนไข ในตัวอย่าง เราใช้ตัวดำเนินการ
==
เพื่อตรวจสอบว่าตัวแปร n
เท่ากับ 5
หรือไม่ ถ้ามันเท่ากับ 5
เราจะแสดงผล "n equal to 5" ออกทางหน้าจอ
เพื่อให้คุณเข้าใจถึงวิธีการใช้งานมากขึ้น ต่อไปมาตัวอย่างเพิ่มเติมสำหรับการใช้งานตัวดำเนินการเปรียบ โดยเราจะเขียนโปรแกรมสำหรับบอกว่าสภาพอากาศเป็นอย่างไร โดยคำนวณจากอุณหภูมิที่รับเข้ามา
#include <iostream>
using namespace std;
int main()
{
int degree_f, degree_c;
string feeling;
cout << "Enter temperature (F): ";
cin >> degree_f;
degree_c = (degree_f - 32) * (5 / 9.0f);
cout << degree_f << " 'F = " << degree_c << " 'C" << endl;
if (degree_f < 30)
{
feeling = "freezing";
}
else if (degree_f < 50)
{
feeling = "cold";
}
else if (degree_f < 70)
{
feeling = "cool";
}
else if (degree_f < 90)
{
feeling = "warm";
}
else
{
feeling = "hot";
}
cout << "Today the weather is "<< feeling << ".";
return 0;
}
ในตัวอย่าง เป็นโปรแกรมบอกสภาพอากาศโดยคำนวณจากอุณหภูมิ โปรแกรมของเราถามให้ผู้ใช้กรอกอุณหภูมิในองศาฟาเรนไฮต์ และเราทำการคำนวณอุณภูมิสำหรับองศาเซลเซียสด้วย หลังจากนั้นเราใช้ตัวดำเนินการสำหรับเปรียบเทียบค่าของอุณหภูมิในช่วงต่างๆ ว่าอากาศนั้นเป็นแบบไหน
Enter temperature (F): 57
57 'F = 13 'C
Today the weather is cool.
นี่เป็นผลลัพธ์การทำงานของโปรแกรมเมื่อเรากรอกอุณหภูมิเป็น 57 และโปรแกรมแปลงเป็นองศาเซลเซียสเท่ากับ 13 และบอกว่าอากาศเย็นสบายดี
Logical operators ( !, &&, || )
ตัวดำเนินการตรรกะ ใช้เพื่อประเมิน Expression ของตัวแปรซึ่ง Expression สามารถประกอบไปด้วยตัวแปรเดียวหรือมากกว่า นี่เป็นตารางของตัวดำเนินการตรรกะ
Symbol | Name | Example |
---|---|---|
! | Not | ! (n==1) |
&& | And | a == 1 && b == 1 |
|| | Or | a == 1 || b == 1 |
ตัวดำเนินการตรรกะมักจะใช้เพื่อเปรียบเทียบและสร้างเงื่อนไข ผลลัพธ์สุดท้ายนั้นจะเป็น
true
หรือ false
เท่านั้น มาดูตัวอย่างbool isRain = true;
if (!isRain)
{
cout << "I will go to beach" ;
}
เรามีตัวแปร
isRain
ซึ่งเป็นตัวแปรที่ใช้บ่งบอกว่าฝนตกหรือไม่ ในคำสั่ง if (!isRain)
มีความหมายคือ "if it not rain" เราจะแสดงผลข้อความ "I will go to beach" ออกทางจอภาพchar c = 'a';
if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')
{
cout << "c is a vowel" ;
}
ในตัวอย่าง เรามีตัวแปร
c
ซึ่งสามารถเก็บค่าของตัวอักษรภาษาอังกฤษทุกตัวได้ และเราใช้ตัวดำเนินการ ||
(or) เพื่อเช็คว่าถ้า c
เป็นสระใดๆ เราจะแสดงผลออกทางจอภาพว่า "c is vowel" อย่างไรก็ตามคุณสามารถลองใช้ตัวดำเนินการ &&
(and) ได้ด้วยตัวเอง
เพื่อให้คุณเข้าใจในการใช้งานตัวดำเนินการตรรกศาสตร์มากขึ้น มาดูตัวอย่างการใช้งานเพิ่มเติม เราได้พัฒนาระบบรักษาความปลอดภัยในการเข้าสู่ระบบ โดยผู้ใช้ต้องกรอกชื่อและรหัสผ่านสี่ตัวสำหรับเข้าใช้งานในระบบ นี่เป็นโค้ดของโปรแกรม
#include <iostream>
using namespace std;
int main()
{
string name;
int passcode;
cout << "Enter your name >> ";
cin >> name;
cout << "Four digit access code >> ";
cin >> passcode;
if ((name == "mateo" || name == "MATEO") && passcode == 3578)
{
cout << "Accessing granted." << endl;
cout << "Hello Mateo!" << endl;
}
else
{
cout << "Accessing denied." << endl;
}
return 0;
}
ในตัวอย่าง เป็นโปรแกรมสำหรับตรวจสอบการเข้าใช้งานระบบ ในการที่จะเข้าระบบผู้ใช้ต้องกรอกชื่อและรหัสผ่านให้ถูกต้อง และเราประกาศตัวแปร
name
สำหรับชื่อ passcode
สำหรับรหัสผ่านif ((name == "mateo" || name == "MATEO") && passcode == 3578)
{
...
ระบบของเรานั้นจะอนุญาติสำหรับผู้ใช้ที่มีชื่อว่า
"mateo"
อย่างไรก็ตาม ผู้ใช้สามารถพิมพ์ชื่อเป็นตัวพิมพ์เล็กทั้งหมดหรือตัวพิมพ์ใหญ่ทั้งหมดเท่านั้นโดยใช้ตัวดำเนินการ ||
(or) เชื่อมเงื่อนไข และรหัสผ่านต้องเป็น 3578
โดยใช้ตัวดำเนินการ &&
(and) เพื่อเชื่อมเงื่อนไขEnter your name >> mateo
Four digit access code >> 3578
Accessing granted.
Hello Mateo!
นี่เป็นผลลัพธ์การทำงานของโปรแกรม เมื่อเรากรอกชื่อและรหัสผ่านถูกต้อง ทำให้สามารถเข้าใช้งานระบบได้
Conditional ternary operator (?)
Conditional ternary operator ถูกใช้เพื่อประเมิน Expression โดยการใช้ตัวดำเนินการที่คุณได้เรียนไปก่อนหน้านี้แล้ว มันจะให้ผลลัพธ์เป็น
true
ถ้าผลลัพธ์ของ Expression เป็นจริงและจะใช้ค่า false
ถ้าไม่ โดยมีรูปแบบการใช้งานดังนี้condition ? value1: value2
Conditional ternary operator นั้นง่ายต่อการใช้ มันเป็นรูปแบบย่อของการใช้คำสั่ง if เช่น
if (n%2 == 0)
{
cout << "n is even number.";
}
else
{
cout << "n is odd number.";
}
// now using conditional ternary operator
cout << "n is " << (n % 2 == 0 ? "even" : "odd") << " number.";
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 <iostream>
using namespace std;
int main()
{
int a = 2; // 00000010
int b = 5; // 00000101
cout << "a & b =" << (a & b) << endl; // 00000000 = 0
cout << "a & b = " << (a | b) << endl; // 00000111 = 7
cout << "~a = " << ~a << endl; // 11111101 = -1
cout << "a >> 1 = " << (a >> 1) << endl; // 00000001 = 1
cout << "a << 1 = " << (a << 1) << endl; // 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++
Explicit type casting operator
ในภาษา C++ นั้นจะมีข้อมูลประเภทต่างๆ ข้อมูลบางประภทสามารถแปลงไปอีกประเภทได้โดยการใช้ Explicit type casting ข้อมูลบางประเภทจำเป็นต้องใช้ฟังก์ชันจากไลบรารี่ของภาษา C++ หรือคุณสามารถสร้างฟังก์ชันของคุณเองเพื่อแปลงข้อมูลเหล่านั้น ในตัวอย่างนี้เราจะใช้การแปลงข้อมูลแบบ Explicit type casting เพื่อแปลงค่าข้อมูลพื้นฐานเช่น Integer และ Float
float b = 10.25;
int a = (int) b;
ในตัวอย่างนี้ เราได้แปลง
10.25
ไปเป็น Integer ดังนั้นตัวแปร a
จะมีค่าเป็น 10
Operator precedence
ลำดับความสำคัญของตัวดำเนินการ (Operator precedence) ใช้เพื่อกำหนดว่าตัวดำเนินการใช้ที่จะถูกทำงานก่อน ยกตัวอย่างเช่น
5 + 4 * 2
นั้นจะถูกคำนวณเป็น 5 + (4 * 2)
ซึ่งเท่ากับ 13
เพราะว่าตัวดำเนินการคูณ (*
) นั้นมีความสำคัญมากกว่าตัวกำเนินการบวก (+
) ดังนั้นหากเราต้องการให้โปรแกรมบวกกันก่อนเราสามารถใช้วงเล็บ (5 + 4) * 2
จะได้เท่ากับ 22
เพราะว่าวงเล็บนั้นมีความสำคัญมากกว่าตัวดำเนินการคูณ (*
)
ข้างล่างนี้ เป็นตารางแสดงลำดับความสำคัญของตัวดำเนินการในภาษา C++
Operator Name | Associativity | Operators |
---|---|---|
Primary scope resolution | left to right | :: |
Primary | left to right | ()[].-> dynamic_cast typeid |
Unary | ขวาไปซ้าย | ++--+-!~&*(type_name)sizeof new delete |
C++ Pointer to Member | left to right | .*->* |
Multiplicative | ซ้ายไปขวา | */% |
Additive | ซ้ายไปขวา | +- |
Bitwise Shift | ซ้ายไปขวา | <<>> |
Relational | ซ้ายไปขวา | <><=>= |
Equality | ซ้ายไปขวา | ==!= |
Bitwise AND | ซ้ายไปขวา | & |
Bitwise Exclusive OR | ซ้ายไปขวา | ^ |
Bitwise Inclusive OR | ซ้ายไปขวา | | |
Logical AND | ซ้ายไปขวา | && |
Logical OR | ซ้ายไปขวา | || |
Conditional | ขวาไปซ้าย | ?: |
Assignment | ขวาไปซ้าย | =+=-=*= /=<<=>>= %= &=^=|= |
Comma | ซ้ายไปขวา | , |
ในบทนี้ คุณได้เรียนรู้เกี่ยวกับตัวดำเนินการในภาษา C++ เราได้อธิบายความหมายและตัวอย่างการใช้งานตัวดำเนินการประเภทต่างๆ เพื่อนำไปเขียนโปรแกรมให้ตรงกับความของการ และเราได้พูดถึงลำดับความสำคัญของตัวดำเนินการ ที่เป็นสิ่งกำหนดว่าตัวดำเนินการไหนที่จะถูกทำงานก่อน
C++ Operator หรือตัวดำเนินการ ในตอนนี้เราได้รู้จักตัวแปรและค่าคงที่แล้ว ซึ่งสามารถนำมาใช้งานผ่านตัวกระทำการทางคณิตศาสตร์ +, -, *, / และ % ได้ดังที่ได้กล่าวไว้แล้วในเนื้อหาก่อนหน้า
การกำหนดค่า (Assignment)
การกำหนดค่าใน C++ จะใช้ตัวดำเนินการ “=” ซึ่งจะทำการกำหนดค่าให้จากฝั่งขวามือของตัวดำเนินการให้กับตัวแปรที่อยู่ทางด้านซ้ายมือของตัวดำเนินการ ในช่วงแรกของการเขียนโปรแกรมอาจจะรู้สึกฝืนธรรมชาติในการเขียนเล็กน้อย เนื่องจากในทางคณิตศาสตร์เราจะเขียนจากซ้ายไปขวา ตัวอย่างด้านล่างเป็นการกำหนดค่าให้กับตัวแปร
1
2
3
4
5
| int A = 5; int B = -10; A = B; |
จากตัวอย่างด้านบนบรรทัดแรก A จะมีค่าเท่ากับ 5 บรรทัดต่อมาเป็นการกำหนดค่าให้ B เป็น -10 และในบรรทัดสุดท้ายกำหนดให้ A = B จึงหมายความว่าเมื่อทำงานมาถึงบรรทัดนี้ A จะมีค่าเป็น -10 จะเห็นได้ว่าค่าที่อยู่ภายในตัวแปรนั้นสามารถเปลี่ยนแปลงได้โดยอาศัยตัวดำเนินการ =
นอกจากนี้ในการกำหนดค่าให้กับตัวแปรสามารถกำหนดค่าให้กับตัวแปรคราวละมาก ๆ ได้เช่นกัน ดังตัวอย่างต่อไปนี้
1
| A = B = C = 10; |
Compound Assignments
เป็นตัวดำเนินการลดรูปในการใช้งานตัวแปรตัวอย่าง เช่น A = A + 1 เราสามารถใช้ Compound Assignments เพื่อเรียกใช้งานตัวแปร A เพียงครั้งเดียวได้เป็น A += 1
A = A+5; ลดรูปได้เป็น A += 5
A = A-5; ลดรูปได้เป็น A -= 5
A = A*5; ลดรูปได้เป็น A *= 5
A = A/5; ลดรูปได้เป็น A /= 5
A = A%5; ลดรูปได้เป็น A %= 5
Decrease และ Increase operators
Increase operator (++) และ Decrease operator (–) เรียกว่าตัวดำเนินการเพิ่มค่าและลดค่า ใช้ในการเพิ่มและลดค่าที่ละหนึ่งค่าของตัวแปรตามลำดับตัวอย่าง เช่น A++ จะมีความหมายเช่นเดียวกับ A += 1 หรือ A = A+1
ลักษณะสำคัญประการหนึ่งของตัวดำเนินการนี้ได้แก่การนำไปวางไว้ด้านหน้าหรือด้านหลังตัวแปรได้ ตัวอย่าง เช่น A++; หรือ ++A ซึ่งแต่ละตำแหน่งที่วางนั้นจะมีผลลัพธ์ที่ได้แตกต่างกัน ดังตัวอย่างต่อไปนี้
ตัวอย่างตัวดำเนินการเพิ่มค่าและลดค่า
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| #include<iostream> using namespace std; void main () { int A = 5; cout << ++A << endl; cout << A++ << endl; cin.get(); } |
รูปที่ 1. ผลลัพธ์ที่ได้
จากรูปหากตัวดำเนินการ ++A และ A++ มีการทำงานเหมือนกันแล้วผลลัพธ์ที่ได้ควรจะเป็น 6 และ 7 ตามลำดับ สิ่งที่เกิดขึ้นนี้เกิดจากการวางตำแหน่งของตัวดำเนินการซึ่งมีรายละเอียดดังนี้
- หากวางตัวดำเนินการเพิ่มหรือลดค่าไว้หน้าตัวแปร การดำเนินการนั้นจะทำงานทันที
- หากวางตัวดำเนินการเพิ่มหรือลดค่าไว้หลังตัวแปร การดำเนินการจะทำก็ต่อเมื่อสิ้นสุดคำสั่งบรรทัดนั้นไปแล้ว หมายถึงการทำงานของโปรแกรมผ่านเครื่องหมายสิ้นสุดคำสั่ง “;” ของบรรทัดนั้นไปแล้วนั่นเองจึงจะทำการเพิ่มหรือลดค่า
เพื่อให้เห็นภาพชัดเจนขึ้นจะเพิ่มคำสั่งสำหรับแสดงค่าตัวแปร A เข้าไปดังนี้
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| #include<iostream> using namespace std; void main () { int A = 5; cout << ++A << endl; cout << A++ << endl; cout << A << endl; cin.get(); } |
รูปที่ 2. ผลลัพธ์ที่ได้จากคำสั่งการแสดงค่าตัวแปร A เพิ่มเข้าไป
ตัวดำเนินการความสัมพันธ์แบบเปรียบเทียบ
เป็นการเปรียบเทียบความสัมพันธ์ระหว่างนิพจน์สองนิพจน์ ซึ่งผลลัพธ์ที่ได้จากการเปรียบเทียบนี้จะได้เป็นค่าความจริงหรือบูลีน ที่มีค่าที่เป็นไปได้ คือ จริง หรือ เท็จ
ตารางที่ 1. ตัวดำเนินการความสัมพันธ์แบบเปรียบเทียบ
ตัวดำเนินการเปรียบเทียบ | ความหมาย |
== | เท่ากันกับ |
!= | ไม่เท่ากันกับ |
> | มากกว่า |
< | น้อยกว่า |
>= | มากกว่าหรือเท่ากันกับ |
<= | น้อยกว่าหรือเท่ากันกับ |
สิ่งที่ต้องระวังและมักพบข้อผิดพลาดเสมอได้แก่ตัวดำเนินการ == ใช้ในการเปรียบเทียบให้อ่านว่าเท่ากันกับ และตัวดำเนินการ = ใช้ในการกำหนดค่าให้อ่านว่าเท่ากับเพื่อไม่ให้ใช้งานผิดพลาดเวลาทำการเขียนโค้ด
ตัวดำเนินการทางตรรกะ
ตัวดำเนินการทางตรรกะใช้ในการควบคุมทิศทางการทำงานของโปรแกรม โดยจะเป็นตัวเชื่อมการตรวจสอบเงื่อนไขระหว่างสองนิพจน์ ซึ่งจะพบได้ในบทความที่กล่าวถึงเรื่อคำสั่ง if, while และคำสั่งอื่น ๆ ที่ควบคุมทิศทางการทำงานของโปรแกรมซึ่งประกอบไปด้วย
- || เป็นการใช้ตรรกะ OR
- && หมายถึงตรรกะ AND
- ! หมายถึงนิเสธ NOT เปลี่ยนเป็นค่าคู่ตรงข้าม เช่น true จะกลายเป็น false เป็นต้น
ตัวดำเนินการทางตรรกะช่วยให้โปรแกรมสามารถตัดสินใจทำงานได้จากหลาย ๆ เงื่อนไข ด้วยการเชื่อมเงื่อนไขต่าง ๆ นั้นเข้าด้วยกันจากตัวดำเนินการทางตรรกะ ในขณะที่ทำงานตัวโปรแกรมจะเข้าไปยังแต่ละเงื่อนไขเพื่อหาค่าที่ได้ว่าเป็นจริงหรือเท็จ จากนั้นจะใช้การหาค่าของผลลัพธ์จากตารางทางตรรกะที่แสดงไว้ดังต่อไปนี้
ตารางที่ 2 ตัวดำเนินการทางตรรกะ AND (&&)
นิพจน์ 1 | นิพจน์ 2 | ผลลัพธ์ที่ได้จาก นิพจน์1 && นิพจน์2 |
TRUE | TRUE | TRUE |
TRUE | FALSE | FALSE |
FALSE | TRUE | FALSE |
FALSE | FALSE | FALSE |
ตารางที่ 3 ตัวดำเนินการทางตรรกะ OR (||)
นิพจน์ 1 | นิพจน์ 2 | ผลลัพธ์ที่ได้จาก นิพจน์1 || นิพจน์2 |
TRUE | TRUE | TRUE |
TRUE | FALSE | TRUE |
FALSE | TRUE | TRUE |
FALSE | FALSE | FALSE |
ตัวอย่างการใช้งาน
1
| !(10 <= 5) |
ภายในวงเล็บ (10 <= 5) เป็นเท็จ แต่เจอกับนิเสธนอกวงเล็บ (!) จึงกลายเป็นจริง
1
| ((10 = 15) && (5 > 10)) |
เมื่อทำการวิเคราะห์แล้วจะได้ว่า (true && false) เมื่อเทียบจากค่าของตัวดำเนินการทางตรรกะ AND จะได้ค่าผลลัพธ์เป็น false
ในตัวอย่างนี้ขอให้ดูที่นิพจน์ (10 = 15) ใช้ตัวดำเนินการถ่ายค่า “=” ไม่ใช่การเปรียบเทียบซึ่งผลลัพธ์ที่ได้ของนิพจน์นี้คือ (15) ค่าใด ๆ ก็ตามที่ไม่ใช่ 0 จะถือว่าเป็นจริง ทำให้ได้ผลลัพธ์ภายในนิพจน์ (10 = 15) เป็นจริงนั่นเอง ในกรณีนี้หากเปลี่ยนนิพจน์ (10=15) เป็น (10=0) นิพจน์ใหม่จะให้ค่าผลลัพธ์เป็นเท็จ ในการเขียนโปรแกรมโดยทั่วไปนั้น ลักษณะของตัวอย่างที่ยกมาแทบไม่เกิดขึ้น แต่มักจะเกิดจากความผิดพลาดของโปรแกรมเมอร์ ที่มักหลงลืมใช้ตัวดำเนินการ “=” (เท่ากับ) แทน “==” (เท่ากันกับ) ทำให้ผลลัพธ์ที่ได้ผิดเพี้ยนจากที่ต้องการ
1
| ( (5 > 10) || ( 10 == 10) ) |
ผลลัพธ์ของแต่ละนิพจน์จะได้เป็น ( (false) || (true) ) ทำให้ได้ผลลัพธ์เป็นจริง
ตัวดำเนินการทางบิต
มีลักษณะคล้ายกับตัวกระทำการทางตรรกะเพียงแต่จะเข้าไปจัดการกับข้อมูลลึกถึงระดับบิตโดยมีรายละเอียดดังตารางต่อไปนี้
ตารางที่ 4 ตัวดำเนินการทางบิต
ตัวดำเนินการทางบิต | รายละเอียด |
& | AND |
| | OR |
^ | XOR |
~ | Unary complement กลับค่าบิต จาก 0 เป็น 1 และ จาก 1 เป็น 0 |
<< | เลื่อนบิตไปทางซ้าย |
>> | เลื่อนบิตไปทางขวา |
ตารางที่ 5 การกระทำทางบิต
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 = 65; และ B = 27; จะได้ค่าเป็นเลขฐานสอง คือ
A = 0100 0001
B = 0001 1011
ดังนั้นผลที่ได้จากการใช้ตัวดำเนินการทางบิตโดยอาศัยตารางด้านบนตรวจสอบค่าบิตต่อบิตระหว่าง A และ B จะได้เป็น
A&B = 0000 0001
A|B = 0101 1011
A^B = 0101 1010
~A = 1011 1110
A<<1 = 1000 0010
A>>1 = 0010 0000