01/10/2018, 09:25

Nhờ giải thích lỗi khó hiểu C++

Thấy có bạn đăng bài “Làm đẹp tên”, nhân tiện đang ôn chuẩn bị thi tốt nghiệp, mình làm thử. Và không hiêu sao 2 code này chỉ khác nhau ở dòng thứ 21 mà lại chạy ra kết quả khác nhau:

Temp = "" + Input[0];
//Ran Hoan
Temp = "";
Temp += Input[0];
//Tran Hoan

Đây là code của em, coi như không biết gì C++ viết nên có thể nhìn hơi rối mắt, mong có cao nhân nào giúp đỡ ~~
http://ideone.com/yjz03X (Ran Hoan) và https://ideone.com/vMXChl (Tran Hoan)

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

Debug để biết code làm gì.

Trần Hoàn viết 11:27 ngày 01/10/2018

C++ dí F11 hơn 5 phút nó vẫn chạy đi chạy lại ở cái file này, mà nhỡ vô tình dí quá tay…

Chuyển sang C# debug dễ hơn thì 2 code đó đều chạy đúng

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

Hi Trần Hoàn.
Đặt breakpoint rồi F5 @_@!

Trần Hoàn viết 11:31 ngày 01/10/2018

Thì vẫn thế, mình không hiểu tại sao Temp = "" + Input[0]; hay Temp = (std::string)("" + Input[0]); thì vẫn là Temp == "" trong khi Input == "TrAN HoaN"

KYN viết 11:38 ngày 01/10/2018

http://www.cplusplus.com/reference/string/string/operator+/
http://www.cplusplus.com/reference/string/string/operator+=/
thử xem sự khác nhau giữa 2 toán tử xem có j ko

Trần Hoàn viết 11:40 ngày 01/10/2018

Okay. A += B không có nghĩa là A = A + B
Hay lắm C++
Hay!

Do Ngoc Anh viết 11:27 ngày 01/10/2018

http://www.cplusplus.com/doc/tutorial/operators/

Sao đây ghi giống mà bác.

*grab popcorn* viết 11:35 ngày 01/10/2018

A += B tương đương A = A + B khi A là lớp string.

Trường hợp trên thì
"" + Index[0] = const char * + &char -> Không tương đương.

Gió viết 11:29 ngày 01/10/2018

Lỗi này không phải do operator+= hay operator+ của string.
""const char * khi cộng vào Input[0] thì nó trỏ đến địa chỉ khác sau đó mới chuyển về string, cái này là undefined behavior, không cộng được mảng kí tự với số để nối chuỗi.

Temp=""; Temp+=Input[0];
Cái này có sự khác biệt, Tempstring ở dòng sau thì phép cộng là hoàn toàn đúng. Do đó thuật toán khi dùng phép này không bị lỗi

Trần Hoàn viết 11:35 ngày 01/10/2018

Ồ, thì ra " "const char* chứ không phải là string như mình vẫn tưởng, code lỗi là do mình hiểu sai.
Mình vừa thử ép kiểu Temp = (std::string)"" + Input[0]; thì code chạy đúng, cảm ơn các thím
Mà mọi người cho mình hỏi luôn, tại sao lại là const char* mà không phải là char* hay char[]. Mình vốn từ C# nhảy ngược về nên không hình dùng được sự khác nhau này.

Do Ngoc Anh viết 11:34 ngày 01/10/2018
Rất vui khi nhận được sự quan tâm theo dõi của các bạn trong khóa học lập trình trực tuyến ngôn ngữ C++. Trong bài học này, chúng ta sẽ cùng nhau tìm hiểu một số điểm cần lưu ý khi sử dụng con trỏ trỏ đến mảng kí tự (C-style string). C-style string symbolic constants C-style string là một trường hợp đặc biệt của mảng một chiều, được ngôn ngữ C++ hổ trợ một số đặc điểm nhằm giúp lập trình viên thao tác với C-style string một cách thuận tiện hơn. Ngoài cách khởi tạo mảng một chiều thông thườ…

Đây bác

rogp10 viết 11:38 ngày 01/10/2018

" " gọi là string literal. Chuẩn C/C++ quy định nó là const char* vì trong asm mấy string literal nằm trong vùng read-only.

Bài liên quan
0