Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ลำดับการประเมิน Operands ใน C++

ลำดับการประเมิน 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; // ลำดับชัดเจน