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,…

Advertisements

Author: phuoctv

My name is Phuoc. I'm interested in computer programming and sharing the knowledge. My email: phuoctv14@gmail.com

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s