Chào mừng bạn đến với C++!
cho một cái gì đó thậm chí hài hước thử điều này:
#include <string>
int main(int argc, const char *argv[])
{
std::string s;
s = 3.141592654;
return 0;
}
tại sao nó biên dịch? Lý do là các quy tắc ngôn ngữ nói như vậy.
Trong trường hợp sôi nổi này giải thích "chính thức" về lý do tại sao ví dụ này biên dịch là dường như cho phép std::string::operator+=(char)
(IMO ok và logic từ quan điểm thực dụng) và "do đó" cũng được gán từ char (IMO illogical non) - hậu quả). Nhưng ký tự là ints (phi logic, nhưng di sản C) và đôi có thể được chuyển đổi hoàn toàn thành int (phi logic, nhưng di sản C). Vì vậy, trong C++ nó vô lý (nhưng hợp pháp) để gán một đôi vào một chuỗi. Không cảm thấy xấu nếu bạn không biết, hầu hết các lập trình viên C++ tôi cho thấy điều này thật khó hiểu vì sao một trình biên dịch vô nghĩa như thế và nghĩ về một trong hai lỗi ngữ nghĩa hoặc trình biên dịch khác.
Trong trường hợp của câu hỏi của bạn, lý do là enums giống như ints trong một số ngữ cảnh (có thể do di sản trong trường hợp sử dụng) nhưng không giống như ints trong một số ngữ cảnh khác. Đó là vô lý nhưng đó là những gì các tiêu chuẩn bắt buộc.
Nếu bạn cảm thấy không thoải mái với điều này dường như không có logic, hãy nhớ rằng C++ chủ yếu là kết quả của một lịch sử lâu dài và thậm chí cả một ủy ban (!). Điều này cũng ngụ ý rằng người ta không thể sử dụng logic để tránh học C++: dù bạn có thông minh đến đâu đi chăng nữa thì không có cách nào bạn có thể đoán được các tai nạn lịch sử và quyết định chính trị của ủy ban.
Độ phức tạp cao của C++, sự vắng mặt của logic ở nhiều nơi và sự hiện diện của undefined behavior daemons
thay vì runtime error angels
cũng là những gì IMO về cơ bản quyết định học C++ bằng thử nghiệm.
Chọn một cuốn sách hay (hoặc một số ít) và đọc nó (chúng) che phủ để che đi ... không may là không có cách nào khác. Đề xuất của tôi là: "Ngôn ngữ lập trình C++" (Stroustrup), "Hiệu quả C++" & "Hiệu quả hơn C++" (Meyers), "C++ Câu hỏi thường gặp" (Cline/Lomow/Girou).
C++ là một vũ khí khá mạnh mẽ và tốt đẹp để sở hữu, nhưng tiếp cận nó từ phía bên trái và nó chỉ có thể trở thành tồi tệ nhất của cơn ác mộng của bạn. Giả sử rằng bạn có thể hiểu nó chỉ bằng cách sử dụng logic là một cách tiếp cận sai (và không phải vì logic của bạn là yếu, nhưng vì C + + không chỉ là logic).
không nên là trường hợp không biên dịch sẽ là: 'variable = EB_Element;'? – Donotalo
@Donotalo: Đã sửa lỗi, cảm ơn bạn. – sharptooth