Cần giải thích kết quả đoạn code

giải thích cho em tại sao kết quả lại bằng 248 ạ

#include <stdio.h>
#include <conio.h>
void main()
{
	int m = 60, a = 0;
	++m;
	a += m * 3 + ++m;
	printf_s("a = %d", a);
	_getch;
}

Em tính kiểu gì ra 248 vậy?

++m = 61
a = ( 3 * 61 ) + (++)61 = 183 + 62 = 245

3 Likes

Đây anh

  1. Code này bên C# ra 245
  2. Bạn gõ code lỗi, hàm getch() thiếu ngoặc mà vẫn chạy được à? Thấy debug không được thì đừng bấm YES mà bấm NO rồi sửa lỗi đã, không là nó chạy lần code đúng gần nhất đó.
2 Likes

Em đã chỉnh lại build succeeded không lỗi. Nhưng vẫn ra 248. :slight_smile:

Mình nghĩ cái này là undefined behavior.
gcc và clang cho kết quả 245 nhưng vc cho kết quả 248.

1 Like

Vậy là vs tính bên phải trước à, nguy hiểm thật :thinking:

1 Like

Mình test cũng ra kết quả như thớt, không hiểu được nó lấy giá trị kiểu gì, nếu đổi thành m++ thì kết quả là 61*3 + 61 = 244, tách riêng thành a += m*3;a += ++m; thì ra 245, còn để yên thì ra 248 O_o

Cái này là undefined behavior.
Khác nhau với từng compiler.
Nên tốt nhất là không dùng, không tìm hiểu. Bởi vì thực sự nó không mang lại cái lợi ích gì cả. Nhiều lúc sml không chừng.

2 Likes

Mấy cái này undefined, không nên hỏi kết quả :smiley: bởi vì nó tùy vào thứ tự tính toán, mà cái này unspecified (tức là trình biên dịch muốn tính trước sau tùy thích và không có quy định), rủi ro chỉ đứng sau undefined.

1 Like

Thôi, từ nay ra éo dùng ++ trong biểu thức kết hợp nữa :joy: Loạn vl

1 Like

Thật á :smiley: Xem ra quy định tiền toán tử giữa VC++ với VC# và giữa VC++ với các bản C++ khác là khác nhau à?

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