01/10/2018, 09:45
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;
}
Bài liên quan
Phép
+=, -=, *=,...
đã là một phép gán rồi, không cần phải thêmvariable =
ở trước nữa.Hình như bạn không hiểu bản chất của các phép
+=, -=, *=,...
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?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
a += b;
gần như tương đương vớia = a + b;
Bạn bảo trên daynhauhoc.com ghi như thế thì bạn đưa dẫn chứng đi?
nó là a = a + b đó bạn , gần như gì
Không hẳn bạn.
stackoverflow.com
a += b
thì nó lấy a làm ô nhớ trung gian rồi tính toána = 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 aCó thể hiểu
+=
là một phép tăng, còn=
và+
là hai phép tính bao gồm phép cộng và phép gán.Is x += a quicker than x = x + a?
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.
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ý doif (x = 2)
không báo lỗi vì nó tương đương vớiif (2)
hayif (true)
Mà riêng thằng cout thì mình không hiểu sao nó không cho
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).À, đó 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ớia = a + b
a += b
có thể biểu diễn như sau:a + b
thì có thể biểu diễn như sau: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.
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.
cái này chắc cần phải tìm hiểu thêm rồi. khi làm sâu về mức hệ thống có thể sẽ thấy được sự khác biệt