Giúp giải thích cách hoạt động của biểu thức ++a + ++a + ++a

int a = 10;
int b = ++a + ++a + ++a;

khi mình cho chạy, thì ra kế quả là 37 mình không hiểu sao nữa. Mọi người ai biết chỉ mình với. thanks!

Có mùi Undefined Behavior…

Đúng vậy, không thể nghĩ bàn :slight_smile:

  1. Giữa hai sequence point, chương trình nào thay đổi cùng một biến hai lần thì sẽ bị undefined.
  2. Giữa hai sequence point, mọi side effect (tăng 1/giảm 1, gán, …) có thể xảy ra trước, trong và sau khi biểu thức được tính.

C++ mở lỏng hơn chút với ++a (buộc side-effect tính trước) nhưng a++ thì vẫn vậy. Vì vậy đừng ai nói C++ là em của C :slight_smile:

Bác nói rõ tí được k :))
sequence point là gì ? e GG đọc vẫn chưa thông.
side-efect là j ?

Link này nói cả sequence point và side-effect:

Trích từ N1256:

  • Theo 5.1.2.3, mục 2: side effect là bất cứ thay đổi môi trường nào, bao gồm thay đổi biến, sửa bất cứ thứ gì liên quan đến file và tính toán dấu phẩy động.

  • Cũng theo mục 2, sequence point là điểm được đảm bảo là các side effect trước đó đã phải được thực hiện hết và không có side effect nào mới. Xem phụ lục C để xác định đâu là sequence point.

  • Kết thúc một câu lệnh là một sequence point.

  • Sau khi tính toán hạng thứ nhất của && || ? (tam phân) và , là sequence point. Nghĩa là i? i++ : i-- là undefined.

  • Sau khi hàm thư viện trả về là sequence point.

2 Likes

Hi Trọng Dũng.
Cái này có thể coi là hạn chế của ngôn ngữ. Với một biểu thức như của bạn thì kết quả phụ thuộc vào cách trình biên dịch sinh mã máy và đôi khi ra các kết quả không dự đoán trước được.

1 Like

Undefined Behavior

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?