Code bị báo lỗi, không biết sai ở đâu

nó cứ báo lỗi :((

#include<iostream>

using namespace std;
 
int main()
{
int variable =20;

	
	cout<<"hihi1 "<<variable = variable +=1<<endl ;
	cout<<"hihi2 "<<variable = variable -=1<<endl;
	cout<<"hihi3 "<<variable = variable *=2<<endl;
	cout<<"hihi4 "<<variable = variable /=2<<endl ;
	cout<<"hihi5 "<<variable = variable %=3<<endl ;
	system("pause");
	
 
	 return 0;
 }

Phép +=, -=, *=,... đã là một phép gán rồi, không cần phải thêm variable = ở trước nữa.
Hình như bạn không hiểu bản chất của các phép +=, -=, *=,...

2 Likes

mình mới học c++, bài ở trên daynhauhoc.com ghi như vậy mà!

Hư cấu à nha :v thế bạn bỏ variable = có compile được không?

1 Like

Ghi lại thê này, mà ai lại gán 2 lần thế này!
Hàm cout nó không chấp nhấp nhận phép gán như bạn đâu

        int variable = 20;
	variable = variable += 1;
	cout << "hihi1 " << variable << endl;
1 Like

a += b; gần như tương đương với a = a + b;
Bạn bảo trên daynhauhoc.com ghi như thế thì bạn đưa dẫn chứng đi?

1 Like

nó là a = a + b đó bạn , gần như gì :slight_smile:

Không hẳn bạn.
a += b thì nó lấy a làm ô nhớ trung gian rồi tính toán
a = a + b thì nó lấy giá trị của a và b làm tham số, tính a + b rồi ghi lại vào a
Có thể hiểu +=một phép tăng, còn =+hai phép tính bao gồm phép cộng và phép gán.

a += b và a = a + b thì khi lập trình trong các phép gán số nguyên thông thường sẽ thấy kết giống nhau, nhưng mà hai cái này không phải alias của nhau cho nên bạn 2D_team_free_online_Education (yeuhangxom) và bạn Trần Hoàn (noz1995) đều có lý.

Nếu dạy người khác học hoặc viết sách thì cần giải thích đào sâu như bạn Trần Hoàn vì không lý do gì đẻ ra hai cái cho rắc rối nếu nó y chang nhau.

Mình ko nghĩ phép gán có thể print đc

Print tuốt. Test ra thì thớt viết như vậy máy nó hiểu là
(cout << x) = (x += 1); // lỗi biên dịch: cout không gán bằng số được
nếu thêm ngoặc đúng thì có vẻ không bị undefined.

2 Likes

Phép gán += thì không print được, nó tương đương với hàm trả về void
Phép gán = thì print được, nó tương đương với hàm trả về int. Đây cũng là lý do if (x = 2) không báo lỗi vì nó tương đương với if (2) hay if (true)
Mà riêng thằng cout thì mình không hiểu sao nó không cho :persevere:

2 Likes

Vì dấu bằng trình biên dịch coi đó là cho cout.
error: no match for ‘operator=’ (operand types are ‘std::basic_ostream<char>’ and ‘int’) cout << x = 1;
Operator<< trả về chính nó (cout). Máy nó hiểu thành operator=(operator<<(cout, x), 1).

1 Like

À, đó là do mình sai cú pháp :))
Nếu làm đúng thì sẽ thế này:

theo như bạn nói thì ở phép tính a = a + b thì a không là trung gian??? , vậy khi thục hiện phép tính kia thì HDH sẽ suy xuất a ở địa chỉ ô nhớ nào , và trong a += b thì HDH sẽ lấy a ở địa chỉ ở đâu??? , đương nhiên họ không vẽ ra 2 cái y chang nhau nhưng nó chung về mặt bản chất , tương tự nhưng 2 ngôn ngữ ở 2 quốc gia , nó nói về chung 1 vấn đề nhưng cách diễn đạt nó khác

Nó khác nhau ở chỗ a += b là 1 phép tính, không sử dụng thêm ô nhớ tạm để chứa giá trị phép toán nên thời gian xử lý sẽ nhanh hơn (không đáng kể) so với a = a + b

a += b có thể biểu diễn như sau:

void Increase(int &a, int b)
{
	...
}

a + b thì có thể biểu diễn như sau:

int Add(int a, int b)
{
	...
	return Output;
}

Trích dẫn từ: https://cpp.daynhauhoc.com/1/8-cac-phep-toan-co-ban/

"Biến được gán giá trị luôn luôn nằm bên trái toán tử “=”.

Toán tử gán có thể dùng ngay khi khai báo biến để vừa khai báo vừa khởi tạo giá trị cho biến, hoặc có thể tách riêng thành một dòng lệnh.

int variable = 5;
variable = 10;
variable = 5 * 3 + 2;

int another_variable = 3;
variable = another_variable * 2;

variable = variable + 1; //tăng giá trị biến variable lên 1.
variable = variable - 1; //giảm giá trị biến variable đi 1.
variable = variable * 2; //nhân giá trị biến variable lên 2 lần.
variable = variable / 2; //chia giá trị biến variable đi 2 lần.
variable = variable % 3; //lấy phần dư của biến variable khi chia 3.
Những cách sử dụng toán tử gán như trên hoàn toàn hợp lệ.

Riêng với 5 dòng lệnh gán cuối cùng, chúng ta có một cách viết tắt khác ngắn gọn hơn.

variable += 1;
variable -= 1;
variable *= 2;
variable /= 2;
variable %= 3;
Cách dùng này có ý nghĩa hoàn toàn giống với cách viết ở trên."

Bạn kiếm một cuốn sách dạy lập trình C/C++ để đọc bạn sẽ thấy họ giải thích chỗ đó, mình hiểu nhưng không thể giải thích cho người khác được.

Hầu hết các tình huống, trình biên dịch sẽ sinh ra mã assembly giống nhau, nhưng trong một số trường hợp a = a + b sẽ được xem là evaluated những hai lần.

Cho nên, với lập trình viên ở mức thông thường, cứ xem a = a + b và a += b là như nhau cho dễ. Đến một ngày nào đó thì tự nhiên sẽ biết nó khác ra sao.

Điều này giống như học tiếng Anh, vào lớp 7-8 mà viết câu I do love her. thì sẽ bị cho là sai ngữ pháp và câu đó sẽ không có điểm, nhưng sinh viên năm 3 ngành Ngôn ngữ Anh viết câu đó sẽ chẳng ai nói gì.

Mình không phải lập trình viên ở cấp độ nào hết, cho nên cũng chỉ biết a = a + b và a += b có sự khác biệt, đọc giải thích trong mấy sách dạy lập trình thì thấy có ví dụ hiểu được, có ví dụ thấy rối rắm, nhưng với những đoạn mã thông thường cho trường hợp a, b là integer thì viết cách nào cũng được.

3 Likes

trân thành cảm ơn bác nhé :)))~

còn mình thì ko bao h sử dụng phép gán để in ra cả nên cũng ko biết :v :v nhưng mà làm như vậy chỉ giúp cho logic code thêm lằng nhằng chứ ko cải thiện đc tốc độ, thế nên vẫn thích viết rạch ròi hơn.

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