01/10/2018, 14:25

Giúp mình hiểu cách phép toán này hoạt động với

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!

HK boy viết 16:30 ngày 01/10/2018

Có mùi Undefined Behavior…

rogp10 viết 16:37 ngày 01/10/2018

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

  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

Trọng Dũng viết 16:41 ngày 01/10/2018

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 ?

HK boy viết 16:32 ngày 01/10/2018

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:

stackoverflow.com
Prasoon Saurav

Undefined behavior and sequence points

c++, undefined-behavior, c++-faq, sequence-points
asked by Prasoon Saurav on 05:37AM - 14 Nov 10
rogp10 viết 16:38 ngày 01/10/2018

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.

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

Tao Không Ngu. viết 16:37 ngày 01/10/2018

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.

Bài liên quan
0