Đó là một lỗi rõ ràng, ngoài sự nghi ngờ.
Mục đích của cảnh báo KHÔNG được cảnh báo về tất cả các bộ phận trong chương trình. Điều đó sẽ quá ồn ào trong bất kỳ chương trình hợp lý nào. Thay vào đó, mục đích là để cảnh báo bạn khi bạn cần kiểm tra một đối số. Trong trường hợp này, bạn đã kiểm tra đối số. Do đó, trình biên dịch nên đã lưu ý rằng, và đóng cửa.
Việc triển khai kỹ thuật tính năng như vậy được thực hiện bằng cách gắn nhãn các biến trong các nhánh mã với các thuộc tính nhất định. Một trong những thuộc tính phổ biến nhất là trạng thái ba "Is null". Trước chi nhánh, arg
là biến bên ngoài và arg [[Isnull]]
không xác định. Nhưng sau khi kiểm tra trên arg
có hai chi nhánh. Trong chi nhánh đầu tiên arg [[Isnull]]
là đúng sự thật. Trong nhánh thứ hai arg [[Isnull]]
là sai.
Bây giờ, khi nói đến việc tạo cảnh báo con trỏ chia và không, thuộc tính [[IsNull]
phải được kiểm tra. Nếu đúng, bạn có cảnh báo/lỗi nghiêm trọng. Nếu không biết, bạn nên tạo ra cảnh báo được hiển thị ở trên - một vấn đề tiềm ẩn, ngoài những gì trình biên dịch có thể chứng minh. Nhưng trong trường hợp này, thuộc tính [[isNull]]
là Sai. Trình biên dịch bằng logic chính thức giống như con người, biết rằng không có rủi ro.
Nhưng làm cách nào để biết trình biên dịch đang sử dụng thuộc tính [[Isnull]]
nội bộ? Nhớ lại đoạn đầu tiên: không có nó, nó sẽ phải cảnh báo luôn hoặc không bao giờ. Chúng ta biết nó cảnh báo đôi khi, ergo phải có một thuộc tính [[IsNull]]
.
Hãy quan tâm, so sánh các đối số "gấp đôi" về bình đẳng. Ma thuật tà ác xảy ra ở đó ... – SadSido
Không. Quy trình được xác định hoàn hảo. Đặc biệt, '0.0 == -0.0'. Do đó, đối với tất cả các tập hợp các giá trị mà '1/arg' được định nghĩa, chúng ta biết rằng' arg! = 0.0'. – MSalters
@MSalters: Nhưng do lỗi làm tròn, arg có thể không phải là 0,0 (hoặc -0,0 cho vấn đề đó) khi bạn mong đợi nó. – jalf