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
)
Bài liên quan
Debug để biết code làm gì.
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
Hi Trần Hoàn.
Đặt breakpoint rồi F5 @_@!
Thì vẫn thế, mình không hiểu tại sao
Temp = "" + Input[0];
hayTemp = (std::string)("" + Input[0]);
thì vẫn làTemp == ""
trong khiInput == "TrAN HoaN"
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
Okay.
A += B
không có nghĩa làA = A + B
Hay lắm C++
Hay!
http://www.cplusplus.com/doc/tutorial/operators/
Sao đây ghi giống mà bác.
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.Lỗi này không phải do
operator+=
hayoperator+
của string.""
làconst char *
khi cộng vàoInput[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,
Temp
là string ở 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Ồ, thì ra
" "
là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ímMà 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*
haychar[]
. 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.Đây bác
" "
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.