ลำดับการประเมิน Operands (Evaluation Order)
ใน C++ ลำดับการประเมิน operand ของตัวดำเนินการส่วนใหญ่ไม่ได้ถูกกำหนด (Unspecified) ยกเว้นบางตัวดำเนินการ (&&, ||, ?, ,)
คอมไพเลอร์อาจเลือกประเมินซ้าย-ขวา, ขวา-ซ้าย, หรือแบบอื่น ขึ้นอยู่กับการปรับปรุง (Optimization)
ตัวอย่างแสดงความไม่แน่นอน
#include <iostream>
using namespace std;
int x = 2;
int changeVal() { x *= x; return x; }
int main() {
int p = changeVal() + changeVal(); // ลำดับเรียก changeVal() ไม่ได้รับการรับประกัน
cout << "Value: " << x << endl; // อาจเป็น 16 หรือ 256
cout << "Operation result: " << p << endl; // อาจเป็น 20 หรือ 272
return 0;
}
ผลลัพธ์ที่เป็นไปได้
- ถ้าเรียกซ้ายก่อน: changeVal()=4, changeVal()=16 -> p=20, x=16
- ถ้าเรียกขวาก่อน: changeVal()=4, changeVal()=16 -> ผลลัพธ์เหมือนกันในกรณีนี้ แต่ถ้าเป็น
changeVal() - changeVal()จะต่างกัน
แนวทางปฏิบัติที่ดี
อย่าเขียนโค้ดที่พึ่งพาลำดับการประเมิน operand ใช้ตัวแปรชั่วคราวแทน:
int a = changeVal(); int b = changeVal(); int p = a + b; // ลำดับชัดเจน