30/09/2018, 23:01

Thắc mắc về i++ và ++i

int i=3;
if(i==i++){
	printf("true1");
}
if(i==++i){
	printf("true2");
}

i++ là tăng i sau mà tại sao lại in ra true2 vậy mọi người?

Tao Không Ngu. viết 01:13 ngày 01/10/2018

This post was flagged by the community and is temporarily hidden.

quang viết 01:07 ngày 01/10/2018

mình nên đọc kỹ lại phần nào vậy bạn?

Tao Không Ngu. viết 01:03 ngày 01/10/2018

This post was flagged by the community and is temporarily hidden.

quang viết 01:17 ngày 01/10/2018

[Album] Imgur

Tao Không Ngu. viết 01:12 ngày 01/10/2018

This post was flagged by the community and is temporarily hidden.

Lưu Thành Vương viết 01:11 ngày 01/10/2018

Ví dụ:

int x = 5;
int y = x++; //giá trị của x bây giờ là 6, giá trị 5 ban đầu của x sẽ được gán cho y

Mình trình bày lại cách hoạt động của đoạn code trên thêm 1 lần nữa.

Đầu tiên, biến x được khai báo và khởi tạo giá trị ban đầu là 5. Tiếp theo, biến y được khai báo và gán cho giá trị là x++. Khi gặp toán tử tăng (++) làm hậu tố của biến x, compiler tạo ra một bản sao của biến x mang theo giá trị 5 ban đầu. Bây giờ, biến x gốc được tăng giá trị lên 1 đơn vị (x sẽ bằng 6), nhưng giá trị được gán cho biến y không phải là biến x ban đầu mà là bản sao của biến x (bản sao mang giá trị 5). Sau khi gán giá trị xong, bản sao của biến x bị xóa bỏ.

Mình nghĩ là vậy:
i==i++
+Theo thứ tự ưu tiên i++ sẽ thực hiện trước.

  • i++ tạo ra một bản sao bằng với i (tạm gọi là I=i=3)
    +Sau đó thì i tăng lên 1 đơn vị (i=4)
    +Vì là toán tử hậu tố nên i==i++ sẽ lấy bản sao ra thực hiện i==I mà lúc này i=4 còn I=3 => i==i++ sai
Đỗ Trung Quân viết 01:05 ngày 01/10/2018

Chả hiểu mấy bạn trên nghĩ gì khi đi giải thích ra true2 là đúng? true1 sai
Nhìn đoạn code trên chắc chắn in ra true1 mới là đúng
In ra true2 => IDE đểu =))

Hung viết 01:14 ngày 01/10/2018

Eclipse Java: True1

Lê Văn Hoàng viết 01:02 ngày 01/10/2018

Theo mình nhé:
Về cái if 1 có i++ nó tương đương kiểu như là i+1 => i==i+1 => flase không in true1
Về cái if thứ 2 thì i==++i Đầu tiên nó tăng i từ 3 lên 4 sau đó nó so sánh i==i hay không (cái này luôn đúng rồi ) nên nó in ra true2.bạn tìm hiểu thêm về cái tiền tố trong C ý.

Hung viết 01:05 ngày 01/10/2018

Nên dựa theo lý thuyết của ngôn ngữ, chứ theo ý kiến cá nhân bạn thì làm được gì? Bạn có phải là người tạo ra ngôn ngữ lập trình đâu.

The increment/decrement operators can be applied before (prefix) or after (postfix) the operand. The code i++; and ++i; will both end in i being incremented by one. The only difference is that the prefix version (++i) evaluates to the incremented value, whereas the postfix version (i++) evaluates to the original value. If you are just performing a simple increment/decrement, it doesn’t really matter which version you choose. But if you use this operator in part of a larger expression, the one that you choose may make a significant difference.

Trần Ngọc Khoa viết 01:02 ngày 01/10/2018

Theo mình nghĩ thì toán tử ++ được ưu tiên trước toán tử == cho nên khi bạn dùng chung một biến để so sánh sẽ không có sự khác biệt.
Thay vào đó bạn có thể dùng một biến a khác để so sánh thay vì biến i

int i=3;
int a = 3;
if(a==i++){
	printf("true1");
}
if(a==++i){
	printf("true2");
}
Văn Dương viết 01:14 ngày 01/10/2018

Ý kiến cá nhân :
Không biết và cũng không nên quan tâm vấn đề này. Chỉ nên dung I++.
Mà dù có hiểu được chính xác I++ với ++I trên từng IDE, Compiler cũng không giải quyết được cái vấn đề gì.

Bài liên quan
0