nềnDấu ngoặc đơn trong C có thể gây ra việc truyền ngầm không?
Lần cuối cùng tôi hỏi về việc liệu ngoặc đã gây ra diễn viên tiềm ẩn (here), @pmg là đủ tốt đẹp để chỉ ra rằng "Không có gì trong C được thực hiện dưới đây int" Nhưng ở đó, các cuộc thảo luận là về các toán tử bitwise, và các dấu ngoặc đơn hóa ra chỉ là một sự phân tâm.
Giới thiệu
Dưới đây, các dấu ngoặc đơn là điểm thu hút chính. Hoặc, để nhàm chán hơn nhưng chính xác, các toán tử duy nhất tôi thấy là các dấu ngoặc đơn và toán tử gán.
At this reference about the C parentheses operator, tôi không thấy bất kỳ điều gì về dấu ngoặc đơn thay đổi loại (bên ngoài cú pháp typecast, không phải trường hợp này).
Trong khi đó, here's a reference that reminds that there is automatic type conversion on assignment, nhưng tôi không nghĩ rằng sẽ giải thích hành vi công cụ phân tích tĩnh tôi sẽ mô tả ở đây.
Như trong câu hỏi trước đây của tôi, "OK" có nghĩa là các công cụ phân tích tĩnh đã không cảnh báo về một ngầm loại chuyển đổi, và "KHÔNG OK" có nghĩa là nó đã làm.
int main(void)
{
unsigned int ui;
int i;
ui = (256U); // NOT OK (*) (1)
i = (256U); // NOT OK (*) (2)
i = 256; // OK
i = 256U; // NOT OK
ui = 256U; // OK (3)
ui = 256; // NOT OK
return(0);
}
Tôi có thể hiểu tất cả trừ hai trường hợp đầu tiên - dấu ngoặc đơn làm gì? Nếu họ không làm gì theo cách ngầm định, thì tôi mong đợi (1) là OK và (2) KHÔNG ĐƯỢC OK. Nếu họ làm loại khuyến mãi tự động của các loại nhỏ hơn int lên đến int, sau đó tôi mong đợi (1) là không OK và (2) để được OK. Nhưng công cụ này nói rằng cả hai đều KHÔNG OK.
Đây có phải là lỗi công cụ phân tích tĩnh hay công cụ chính xác và có điều gì khác mà tôi cần phải tìm hiểu về chuyển đổi loại ẩn trong C?
(BTW Tôi hy vọng rằng giá trị 256 đủ nhỏ không gây tràn trên máy của tôi ...)
Công cụ phân tích tĩnh của bạn có thể là sai. Bạn đang sử dụng công cụ gì và các lỗi đó cho bạn biết những gì? – nos
Chuẩn C đảm bảo rằng giá trị 256 sẽ không tràn, không phải trong số học, không phải trong bộ tiền xử lý - trừ khi nó được gán cho một 'char' của một loại nào đó. –