30/09/2018, 16:53
Vấn đề với phép toán `++i` và `i++`?
void bieuthuc(int somot)
{
cout<<10 + ++somot<<endl;
cout<<10 + somot++<<endl;
}
void main()
{
int i=1;
bieuthuc(i);
system("pause");
}
tại sao nó đều ra 12 nhỉ dùng int hay gì làm k sao mà đến void là sai em dị ứng với cái hàm void này ghê
Bài liên quan
bạn hi vọng output trông như thế nào?
thì nó sẽ là 12 và 11
Sai rồi, nó sẽ ra 12 12. Sao ra được 12 và 11 được?
Sửa lại theo nhắc nhở của anh @laptrinhio
somot sẽ bằng 3 ngay sau khi cái giá trị cụm 10 + (somot + 1) được tính xong
thì đó i++ mà nó ra 12 nên em mới đau đầu vậy cái hàm void nó gán tiếp 2 vào cái dưới luôn hả anh ?
i++
sẽ tăng sau khi phép toán10 +1
xong, tức là tăng sau.++i
sẽ tăng trước khi thực hiện phép toán10 +
, tức là tăng trước.chạy xong dòng này là
somot
= 2 rồi màcout<<10 + somot++<<endl;
10 + 2 = 12vậy mình muốn input của mình là 2 dòng khác nhau nghĩa là + riêng từng cái rồi mới gán vào biểu thức phải làm sao ?
Để mình giải thích này:
Lúc đầu
somot
= 1;Và điều bạn sai ở đây là: ++somot thì nó tăng somot lên rồi mới thực hiện các lệnh khác (ở đây là cout)
Còn somot++ thì nó sẽ thực hiện lệnh khác (ở đây là cout) rồi mới tăng lên
cout << 10 + ++somot << endl;
. Bây giờ ++somot sẽ tăng somot = 1 lên thành 2=> 10 + (++somot) = 10 + 2 = 12; Và lúc này,
somot = 2
Thế nhưng, do nằm trong cout, nên nó chỉ cộng bên trong cout thôi, ra khỏi cout, nó trở về ban đầu
=> Lúc này somot = 1
cout << 10 + somot++ << endl;
. Còn cái này, như đã nói ở trên, do++
nằm sau (hay còn gọi là hậu tố), nên sẽ thực hiện các lệnh khác trước:10 + somot (somot lúc này = 1) = 10 + 1 = 11
Rồi sau đó sẽ cout ra 11. Sau khi cout ra 11 rồi thì thằng somot mới tăng lên (
++
).NÓI CHUNG:
++
đứng trước thì sẽ cộng rồi mới thực hiện lệnh khác++
đứng sau thì sẽ thực hiện lệnh khác rồi mới cộngsomot ko có thành 1 khi nó ra khỏi cout nhé ‘3’
Đáp án là 12 12.
Còn để dễ hiểu ++a và a++ thì mời xem 2 ví dụ:
Muốn thây sự khác biệt bạn code ntn
Em nghĩ là sau khi cout, nó sẽ tăng thêm 1, rồi vì lại trở về (vì ra khỏi cout thì cái somot++ đó không còn tác dụng nữa)
Cơ mà sọ nói thêm nữa anh trên kia quáng
chắc chưa đấy? @ltd debug mã assembly ra xem nào, tớ nghĩ là khác đấy.
somot sẽ bằng 3 ngay sau khi cái giá trị cụm 10 + (somot + 1) được tính xong, chứ ko phải sau dòng lệnh đó mới tăng lên. Còn sau đó thì tất nhiên là bằng 3 rồi
Chính xác là thế