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ê

Minh Hoàng viết 18:57 ngày 30/09/2018

bạn hi vọng output trông như thế nào?

viết 19:06 ngày 30/09/2018

thì nó sẽ là 12 và 11

Nguyễn Minh Dũng viết 18:56 ngày 30/09/2018

Sai rồi, nó sẽ ra 12 12. Sao ra được 12 và 11 được?

 cout<<10 + ++somot<<endl; // tương đương 10 + 2 = 12
 cout<<10 + somot++<<endl; // tương đương 10 + 2 = 12

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

viết 18:58 ngày 30/09/2018

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 ?

Nguyễn Minh Dũng viết 19:04 ngày 30/09/2018

i++ sẽ tăng sau khi phép toán 10 +1 xong, tức là tăng sau.

++i sẽ tăng trước khi thực hiện phép toán 10 +, tức là tăng trước.

Evil viết 19:08 ngày 30/09/2018

cout<<10 + ++somot<<endl;

chạy xong dòng này là somot = 2 rồi mà
cout<<10 + somot++<<endl; 10 + 2 = 12

viết 19:04 ngày 30/09/2018

vậ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 ?

nhatlonggunz viết 19:04 ngày 30/09/2018

void bieuthuc(int somot)
{
cout<<10 + ++somot<<endl;
cout<<10 + somot++<<endl;
}

Để 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ộng
*grab popcorn* viết 19:09 ngày 30/09/2018

somot 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ụ:

x = ++a;
-> a= a+1;
x=a
/////////////////
x = a++
-> x = a;
a = a+1;

Muốn thây sự khác biệt bạn code ntn

cout<<so++<<endl;
cout<<++so<<endl;
nhatlonggunz viết 18:58 ngày 30/09/2018

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

Lập Trình Sư viết 19:10 ngày 30/09/2018

// sau dòng lệnh này somot mới bằng 3

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

Nguyễn Minh Dũng viết 18:56 ngày 30/09/2018

somot sẽ bằng 3 ngay sau khi cái giá trị cụm 10 + (somot + 1) được tính xong

Chính xác là thế

Bài liên quan
0