01/10/2018, 08:28

Ai có thể 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;
}
Đỗ Trung Quân viết 10:41 ngày 01/10/2018

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

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

Lê Ngọc Tiến viết 10:39 ngày 01/10/2018

Đây anh

Trần Hoàn viết 10:36 ngày 01/10/2018
  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 đó.
Lê Ngọc Tiến viết 10:43 ngày 01/10/2018

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

Người bí ẩn viết 10:37 ngày 01/10/2018

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.

明玉 viết 10:29 ngày 01/10/2018

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

Trần Hoàn viết 10:40 ngày 01/10/2018

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

Văn Dương viết 10:41 ngày 01/10/2018

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.

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

Mấy cái này undefined, không nên hỏi kết quả 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.

Trần Hoàn viết 10:38 ngày 01/10/2018

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

Trần Hoàn viết 10:29 ngày 01/10/2018

Thật á 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 à?

Bài liên quan
0