8.ตัวดำเนินการ (Operator) ในภาษา C++

สอน 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++
SymbolNameExample
+Additionc = a + b
-Subtractionc = a - b
*Multiplicationc = a * b
/Divisionc = a / b
%Moduloc = 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++
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 นั้นจะเป็นการรวมกันระหว่างตัวดำเนินการกำหนดค่าและตัวดำเนินการทางคณิตศาสตร์หรือตัวดำเนินการระดับบิต และมันสามารถใช้แทนตัวดำเนินการเหล่านั้นได้ในบางกรณีเพื่อทำให้การเขียนของคุณสั้นลง มาดูตัวอย่างการใช้งานในภาษา 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 อีกนัยหนึ่ง มันเป็นการเขียนโปรแกรมแบบมีเงื่อนไข ที่ใช้ในคำสั่งที่มีการเปรียบเทียบ เช่น ifforwhile และ do while เป็นต้น

Relational and comparison operators table

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
มาดูตัวอย่างในหารใช้งานสำหรับการเปรียบเทียบค่า
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 สามารถประกอบไปด้วยตัวแปรเดียวหรือมากกว่า นี่เป็นตารางของตัวดำเนินการตรรกะ
SymbolNameExample
!Not! (n==1)
&&Anda == 1 && b == 1
||Ora == 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++
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 <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 NameAssociativityOperators
Primary scope resolutionleft to right::
Primaryleft to right()[].-> dynamic_cast typeid
Unaryขวาไปซ้าย++--+-!~&*(type_name)sizeof new delete
C++ Pointer to Memberleft 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++


      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();
}

 ผลลัพธ์ที่ได้จากคำสั่งการแสดงค่าตัวแปร A เพิ่มเข้าไป
รูปที่ 2. ผลลัพธ์ที่ได้จากคำสั่งการแสดงค่าตัวแปร A เพิ่มเข้าไป

ตัวดำเนินการความสัมพันธ์แบบเปรียบเทียบ

      เป็นการเปรียบเทียบความสัมพันธ์ระหว่างนิพจน์สองนิพจน์ ซึ่งผลลัพธ์ที่ได้จากการเปรียบเทียบนี้จะได้เป็นค่าความจริงหรือบูลีน ที่มีค่าที่เป็นไปได้ คือ จริง หรือ เท็จ
      ตารางที่ 1. ตัวดำเนินการความสัมพันธ์แบบเปรียบเทียบ
ตัวดำเนินการเปรียบเทียบความหมาย
==เท่ากันกับ
!=ไม่เท่ากันกับ
มากกว่า
น้อยกว่า
>=มากกว่าหรือเท่ากันกับ
<=น้อยกว่าหรือเท่ากันกับ
      สิ่งที่ต้องระวังและมักพบข้อผิดพลาดเสมอได้แก่ตัวดำเนินการ == ใช้ในการเปรียบเทียบให้อ่านว่าเท่ากันกับ และตัวดำเนินการ = ใช้ในการกำหนดค่าให้อ่านว่าเท่ากับเพื่อไม่ให้ใช้งานผิดพลาดเวลาทำการเขียนโค้ด

ตัวดำเนินการทางตรรกะ

      ตัวดำเนินการทางตรรกะใช้ในการควบคุมทิศทางการทำงานของโปรแกรม โดยจะเป็นตัวเชื่อมการตรวจสอบเงื่อนไขระหว่างสองนิพจน์ ซึ่งจะพบได้ในบทความที่กล่าวถึงเรื่อคำสั่ง if, while และคำสั่งอื่น ๆ ที่ควบคุมทิศทางการทำงานของโปรแกรมซึ่งประกอบไปด้วย
  • || เป็นการใช้ตรรกะ OR
  • && หมายถึงตรรกะ AND
  • ! หมายถึงนิเสธ NOT เปลี่ยนเป็นค่าคู่ตรงข้าม เช่น true จะกลายเป็น false เป็นต้น
      ตัวดำเนินการทางตรรกะช่วยให้โปรแกรมสามารถตัดสินใจทำงานได้จากหลาย ๆ เงื่อนไข ด้วยการเชื่อมเงื่อนไขต่าง ๆ นั้นเข้าด้วยกันจากตัวดำเนินการทางตรรกะ ในขณะที่ทำงานตัวโปรแกรมจะเข้าไปยังแต่ละเงื่อนไขเพื่อหาค่าที่ได้ว่าเป็นจริงหรือเท็จ จากนั้นจะใช้การหาค่าของผลลัพธ์จากตารางทางตรรกะที่แสดงไว้ดังต่อไปนี้
      ตารางที่ 2 ตัวดำเนินการทางตรรกะ AND (&&)
นิพจน์ 1นิพจน์ 2ผลลัพธ์ที่ได้จาก นิพจน์1 && นิพจน์2
TRUETRUETRUE
TRUEFALSEFALSE
FALSETRUEFALSE
FALSEFALSEFALSE
     ตารางที่ 3 ตัวดำเนินการทางตรรกะ OR (||)
นิพจน์ 1นิพจน์ 2ผลลัพธ์ที่ได้จาก นิพจน์1 || นิพจน์2
TRUETRUETRUE
TRUEFALSETRUE
FALSETRUETRUE
FALSEFALSEFALSE
      ตัวอย่างการใช้งาน
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 การกระทำทางบิต
pqp & qp | qp ^ q
00000
01011
11110
10011
      ถ้ากำหนดให้ ถ้า 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