Lỗi ưu tiên toán tử gây undefined behavior trong C và C++

Bài này mình sẽ nói tới một trong những trường hợp rất hay gặp nhưng không phải ai cũng để ý tới trong lập trình C và C++.

Các trường hợp được nêu dưới đây gọi là  undefined behavior – một khái niệm khá quen thuộc, nôm na có nghĩa là hành vi không xác định được..

Bắt đầu với trường hợp đầu tiên, các bạn nghĩ kết quả in ra của các đoạn code sau là gì?

int a=1;

printf(“%d%d%d”,++a,a,a++);

hay:

int a=1;

std::cout<<++a<<a<<a++;

hoặc:

int a=1,b;

b=++a+a+a–+–a+a++;

std::cout<<b;

Như tiêu đề đã nói ở trên, kết quả là undefined behavior, vì sao? Vì các ví dụ trên một biến bị thay đổi giá trị quá nhiều lần trong một biểu thức mà không xác định được thứ tự trước sau, ví dụ trong biểu thức b=++a+a+a–+–a+a++; thì toán tử ++ được ưu tiên cao nhất, sau đó là –, rồi +, cuối cùng là =. Nhưng compiler sẽ không biết a++ ưu tiên thực hiện trước hay ++a thực hiện trước, tương tự, –a trước hay a– trước. Dẫn tới kết quả của biểu thức là không xác định và hoàn toàn phụ thuộc vào compiler, GNU GCC cho ra kết quả khác, MSVC++ sẽ cho kết quả khác,…