Toán tử ++ trong C++ và Java

Mình chạy đoạn code này trong DevC++ và NetBeans IDE

int main()
{
  int n=2,t,k;
  t = n++*++n;
  n=2; k = ++n*n++; 
  printf("%d\t%d",t,k); //8 12
  return 0;
}
 public static void main(String[] args) {
        int n=2,t,k;
            t = n++*++n;
            n=2; k = ++n*n++; 
        System.out.println("_"+t+"\t"+k); //_8  9
    }

DevC++ ra kết quả 8 và 12
NetBeans ra kết quả 8 và 9
Mọi người giải thích sự khác nhau cho mình với

1 Like

Nếu không nhầm. n =1 thì t = ++n thì t = 2. T=n++ thì t =1.
Bạn có thể google lại là ra.

Code của C++ bị undefined behavior mất rồi.
Ko nên code như vậy vì nó vi phạm một rule của C/C++

The rules for sequencing says that you can only update a variable once between sequence points.

Còn java theo mình biết thì nó thực hiện câu lệnh từ trái sang phải (ko chắc lắm)
t = n++ * ++n;
Lấy n = 2 thế vào phép tính, sau đó tăng lên 1 (n=3)
Tiếp tới ++n, tăng n lên 1 sau đó lấy n (n=4)
2*4 = 8

k = ++n * n++;
Tăng n lên 1 sau đó bỏ giá trị n vào phép tính (n = 3)
Tiếp tới n++ thì nó lấy giá trị n hiejn tại (n=3) thế vào phép tính nên
k = 3 * 3
Sau đó thì tăng n lên 1

Còn để dễ hiểu toán tử ++ thì ntn

x = ++n
tương đương
n = n + 1
x = n
//
x = n++
tương đương
x = n
n = n + 1
2 Likes

Mình xin hỏi là tại sao lại phải phân biệt ra ++n với n++ ?
Tại sao không chỉ sử dụng mỗi n++ và quên cái ++n kia đi ?
++n có ứng dụng gì nổi trội hơn hẳn n++ hay ++n làm được những cái n++ không làm được ?

(Một con gà chưa bao giờ dùng ++n cho hay @@)

1 Like

Nhớ không nhầm thì mấy tuần trước học, thầy kĩ thuật lập trình của mình nói là ++n cho performance hơn n++ :smile:

Như nhau thôi :smile:
Compiler nào mà cho performance khác nhau là compiler lởm :smile:

1 Like

cái này cũng hack não dữ lắm, như vậy pn có hiểu được không

n=2;
cout<<n++;\\n=2
n=2
cout<<++n;\\n=3

Tốt nhất nên tránh mấy kiểu nhập nhằng khó hiểu.

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