Khác biệt giữa i++ và ++i

2 cái trên thì em đã hiểu rõ rồi .Nhưng lúc em sài 2 cái đó ở nhưng bài tính tổng dùng for để làm thì i++ hay ++i đều có kết quả như nhau , em nghĩ có thể ở những bài đó nó dễ quá đi (em mới học C++ thôi) chỉ có 1 biểu thức lặp nên dù i++ hay ++i đều như nhau nên em chưa thấy sự khác biệt của 2 cái đó ,mọi người cho em cái VD để phân biệt 2 cái đó rõ hơn dùm ạ

4 Likes

ví dụ nè:

int a=5,b=5;
cout<<a++;
cout<<++b;
4 Likes

cái này đơn giản quá về lý thuyết thì cái này hiểu rồi a=5 b=6 nhưng khi làm bài thì khác ạ em chưa thấy sự khác nhau giữa 2 cái này :fearful:

1 Like
int n,i;
printf("\nNhap n:");
scanf("%d",&n);
int S=0;
for (i=0;i<=n;i++)                             
S=S+i*i;
printf("S=%d",S);

nói = lời thế này n cho = 5

với i++ thì 0<5 >> Đ >> gán i vào biểu thức thực hiện lăp và sau đó + i lên xét cho đến khi i=5
còn nếu là ++i thì thế này 0<5>>Đ>> + i lên bắng 1 ( vậy ở đây nó sẽ gán i = 1 vào biểu thức hay là sao ạ em thắc mắc khúc này )

2 Likes

t vừa tìm đc cái này, b vào tham khảo nhé, tiện thể luyện tiếng anh luôn :relaxed:

3 Likes

ẹc thấy đơn giản mà :frowning:

2 Likes

Có một anh giải thích như sau :
i++; hay ++i; trong trường hợp ko để vào biểu thức toán học thì đều như nhau e à. Vì kết thúc câu lênh i++; hay i–; sẽ đều tăng i lên 1. Sự khác nhau là khi em để i++; trong 1 biểu thức toán học thì kq sẽ khác . VD : int x = 1; int y = 2 + (x++); kết quả y vẫn là 3 vì trong biểu thức đó nó gán x la 1 trước . tính xong y nó mới tăng. còn int y = 2 + (++x); thì y = 4 vi tăng x lên xong gán qua x lúc nay x la 2 sau đó + 2 => y = 4.

18 Likes

Ngoài dc hiểu là số nguyên sẽ có cách thực hiện khác nhau, thì trong khi overload operator ++ sẽ có 2 TH. Qua ví dụ sau sẽ thấy rõ khi gọi thì nó thực hiện hàm operator theo cách nào:

#include <iostream>
using namespace std;

struct test{
   test operator ++(){
       cout<< "case 1"<<endl;
       return *this;
   }
   test operator ++(int){
       cout<<"case 2"<<endl;
       return *this;
   }
   
};

int main() {
	// your code goes here
        test t;
        ++t ;// case 1
        t++;// case 2
	return 0;
}
2 Likes

theo mình thì:
++i sẽ tăng i lên trước khi thực hiện câu lệnh đó( giống như nhân chia trước cộng trừ sau).
i++ tăng i lên 1 nhưng là sau khi thực hiện xong câu lệnh đó(cái này bạn coi lại mức độ ưu tiên của các phép toán sẽ rõ hơn :slight_smile: )
nói chung là bạn làm i++ hay ++i thì chỉ quan trọng ở những bài toán cần chính xác đầu cuối (mảng, gán, …)
còn bình thường muốn for từ đầu tới cuối thì cứ như robot bấm vào :))

2 Likes

i++ ++i về cơ bản sau 2 lệnh này giá trị i nó như nhau.
Giá trị cuối cùng giống nhau, khác nhau duy nhất là ++i thì tăng trước rồi mày muốn làm gì mày làm. Còn i++ thì mày làm mẹ cái gì cứ làm đi rồi tao tăng i sau.
i++ là cưới đi rồi chén, ++i là chén đi rồi cưới.,
kết quả vẫn là cưới. Vậy thôi
Ví dụ:

int a=5,b=5;
cout<<"a = "<<a++<<endl;
cout<<"b = "<<++b<<endl;
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;

Kết quả như sau:
a = 5
b =6
a =6
b =6
Trong câu lệnh

for (int i=0;i<5;i++)
	{
		cout<<i<<endl;
	}

và câu lệnh:

for (int i=0;i<5;++i)
{
	cout<<i<<endl;
}

thì kết quả màn hình in ra như nhau.
tuy nhiên khi check điều kiện khác nhau:
đoạn code 1(i++) nó in ra sau rồi tăng i. cuối cùng quay lại check điều kiện i<5
do vậy khi i tăng tới 5 thì stop
đoạn code 2(++i) nó check trước i<5, in ra tới 4 phát check thấy sai là stop.
Tuy nhiên, khi dùng ++i thì bộ xử lý nhanh hơn.
đọc thêm:

++i will increment the value of i, and then return the incremented value.

i = 1;
j = ++i;
(i is 2, j is 2)
i++ will increment the value of i, but return the original value that i held before being incremented.

i = 1;
j = i++;
(i is 2, j is 1)
For a for loop, either works. ++i seems more common, perhaps because that is what is used in K&R.

In any case, follow the guideline “prefer ++i over i++” and you won’t go wrong.

9 Likes

không hề đơn giản, hỏi 10 câu về cái này thì mình nghĩ bạn sẽ sai tầm 5-6 câu?
:smiley: vì thể loại này là kiểu không xác định, lại còn bị phụ thuộc vào từng trình biên dịch, từng hệ điều hành nữa

1 Like
Note:   luôn tránh những loại lệnh không rõ ràng, ++i, i++, --i, i-- .

Chỉ dùng ++, – khi biết chắc chắn thứ tự của chúng

j = ++i   /  i = i+1 , j =i   tăng i lên rồi mới lấy i sử dụng
j = i++  / j = i , i = i +1  lấy i sử dụng trước rồi tăng i lên

a=10;   b=a++;   a =11, b=10
a=10;   b=a--;     a =9, b=10
a=10;   b=++a;   a =11, b=11
a=10;   b=--a;      a =9, b=9

++--i thực hiện trước +
a=10;
b = 1 + a++; -> b = 11    , a = 11 
b = 1 + a--; -> b = 11    , a = 9 

a=10;
b = 1 + ++a; -> b = 12   a = 11
b = 1 + --a; -> b = 10   a = 9

a=10;
b = 1 + a++; -> b = 11    , a = 11 
c = 1 + ++a; -> c = 13   a = 12

----------------------------------------------------------------------------------------
bản chất ++i  ( --i tương tự )
{
  return i+=1;    // i = i + 1;
}

bản chất i++:   ( i--  tương tự )
{
  int temp;
  temp = i;
  i = i + 1;
  return temp;
}
--------------------------------------------------------------------------------------------
nên trong vòng lặp --i và ++i sẽ thực hiện nhanh hơn i-- và i++
--i và ++i thì -- được thực hiện trước
và i++ thực hiện nhanh hơn i = i +1 hoặc  i+=1     vì    i++ là 1 lệnh còn   i = i+ 1 hoặc i+=1 là 1 phép toán
------------------------------------------------------------------------------------------
bản chất i +1  (i -1 tương tự ) 

int i = 0;
printf("i ban đầu: %d", i);       		 i ban đầu: 0
printf("i + 1 = %d", i + 1);                         i + 1 = 1
printf("i sau biểu thức ở trên: %d", i);         i sau biểu thức ở trên: 0

bản chất i++   (i-- tương tự)

int i = 0;
printf("i ban đầu: %d", i);                      i ban đầu: 0    
printf("i++ = %d",i++ , ++i);                        i++ =0 , ++i =1
printf("i sau biểu thức ở trên: %d", i);     i sau biểu thức ở trên:  1
------------------------------------------------------------------------------------------------
for (int i=10 ; i>0 ; i--)    tốn 24 byte
{
}
và 
for (int i=10 ; i>0 ; --i)   tốn 13 byte
{
}

i--++ và --++i trong vòng lặp for không phân biệt về giá trị, chỉ phân biệt về bố nhớ sử dụng
i--++ và --++i  phân biệt trong biểu thức tính toán và trong hàm in ra màn hình
---------------------------------------------------------------------------------------------------------
for ( i++ ; i < n ; )      i trước dấu ; chưa được tăng , sau khi i được lấy để so sánh với n thì i mới tăng
for ( ++i ; i < n ; )      i trước dấu ; đã được tăng , rồi mới lấy i so sánh n  
while (    strcmp ( info[i++].name , check) != 0     );     i sẽ được đặt vào info[i].name để so sánh, nếu đúng thì i mới được tăng

-----------------------------------------------------------------------------------------------------------------
int a = 10, b;
b = 			a++				     +			++a;
		lấy a = 10 để cộng ( rồi tăng a =11)		     +		a =11 tăng a =12 rồi mới cộng cho số trước
b = 10 + 12 = 22
a = 12
---------------------------------------------------------------------------------------------------------------------
int a = 10,b;
b = a++ + ++a;      // không xác định
b,   a++  , a ,   ++a
22   13     14     14
------------------------------------------------------------------------------------------------------------------
int x = 10;
int a;
a = ++x + ++x;   // không xác định

in ra a = 24
x = x + 1;
x = x + 1;
a = x + x;

----------------------------------------------------------------------------------------------------------
int x = 10, a;
a = ++x + --x;   // không xác định
a = 20
đầu tiên ++x thì x=11 sau đó --x thì x=10
cuối cùng 10 + 10 =20
Đầu tiên  --x thì x=9 sau đó ++x thì x=10
cuối cùng 10 + 10=20
Vì theo trình tự kết hợp thì -- được thực hiện trước
---------------------------------------------------------------------------------------------------------
int g=1;
printf("%d %d %d",g,++g,g++); 
3	3	1
 vì compiler này đặt hàm printf làm việc theo kiểu stack. Nó stack tham số từ phải sang trái.
Khi complier đọc đến tham số cuối, thấy g++, nó lấy trị g (tức là 1) chép vào tham số. Sau đó tăng g lên 1 (thành ra 2).
Complier quay qua tham số kế (áp cuối), thấy ++g, nó lấy trị g (tức là 2), tăng 1 (thành ra 3), và chép vào tham số.
Qua tham số kế nữa, g là 3
Như vây, 4 tham số nó nhận được là 
"%d %d %d", 3, 3, 1 ---> và nó in ra 3 3 1

mình tự tìm hiểu và sưu tâm, có chỗ nào sai thì các bạn sử dùng, có 1 số chỗ mình vẫn chưa rỗ về 2 toán tử ++ – này, hy vọng nó giúp bạn chút it
lưu ý là toán tử ++ – sử dụng với con trỏ cũng khá rối, nếu không chú ý thì sai ngay

11 Likes

trong vòng lặp, nếu bạn dùng ++i thì chương trình sẽ chạy nhanh hơn là dùng i++, hình như chỉ khác nhau chỗ đó nếu ko kể đến thứ tự thực hiện phép toán trong biểu thức.

1 Like

Cậu đã test chưa ???

1 Like

really? :joy:
Bảo là i += 1 nhanh hơn i++ thì mình tin chứ bảo ++i nhanh hơn thì…
Với cả nhanh hơn bao nhiêu? Liệu có đến 1 phần triệu giây mỗi lần lặp không?.

2 Likes

Ngày xưa còn mấy bố phán i-- nhanh hơn i++.
Tọng ngay vào vòng lặp vài trăm triệu lần kết quả ngang cơ có lúc i-- thua.
i++ với ++i cũng tương tự.

1 Like

Nguyễn Việt Nam Sơn nói vậy nhé, mình cũng chưa test

1 Like
int d=25;
System.out.println("d++   = " +  (d++) );-->25
System.out.println("++d   = " +  (++d) );-->27
int d=25;
System.out.println("d++   = " +  (++d) );-->26
System.out.println("++d   = " +  (d++) );-->26
2 Likes

++i sẽ nhanh hơn i++. Vì ++i là cộng luôn vào biến i. Còn i++ là tạo 1 biến mới vd là a = i+1. Sau đó gán i=a. Như vậy i++ phải tạo thêm biến mới nên chậm hơn. Theo mình biết là vậy.

1 Like

i++ : Sẽ lấy giá trị hiện tại của I trước sau đó tăng I lên 1 đơn vị. Viết dễ hiểu sẽ giống thế này:

int temp = i;
i = i+1;
return temp;

Khi đó sẽ thấy kết quả trả về của phép toán i++ là giá trị của i trước khi tang lên 1.
__
++i: Sẽ lấy giá trị của I sau khi i tăng I lên 1 đơn vị. Viết dễ hiểu sẽ giống thế này:

i = i+1;
int temp = i;
return temp;

Kết quả trả về là giá trị của i sau khi đã thăng lên 1.


Không có gì nhanh hơn hay chậm hơn ở đây. Khác nhau là thời điểm lấy giá trị của i.

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