2011-09-17 20 views
7

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 ...)

+2

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

+0

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 đó. –

Trả lời

8

Trước tiên, hãy làm rõ một số thuật ngữ. Không có gì có thể gây ra một "diễn viên tiềm ẩn", bởi vì không có điều đó. A cast là toán tử rõ ràng, bao gồm tên loại trong dấu ngoặc đơn trước biểu thức, chẳng hạn như (double)42; nó chỉ định một chuyển đổi . Chuyển đổi có thể rõ ràng (được chỉ định bởi toán tử truyền) hoặc ngầm định, như trong double x = 42;. Vì vậy, những gì bạn đang thực sự yêu cầu là liệu dấu ngoặc đơn có thể gây ra chuyển đổi tiềm ẩn hay không.

Và câu trả lời, ít nhất trong mã bạn đã hiển thị cho chúng tôi, là không.

Trích dẫn các C99 standard (3.7 MB PDF), phần 6.5.1p5:

Một biểu thức trong ngoặc đơn là một biểu thức chính. Loại và giá trị của nó giống hệt với biểu thức không được biểu thị.Nó là một giá trị lvalue, một hàm thiết kế hàm, hoặc một biểu thức rỗng nếu biểu thức không được minh họa là , một giá trị là hàm số hoặc biểu thức void.

Và kể từ 256U đã là primary expression, dấu ngoặc đơn không có sự khác biệt nào cả; dấu ngoặc đơn thường cho biết mức độ ưu tiên, nhưng trong trường hợp này, không có tiền tố để chỉ ra.

Bạn đang sử dụng công cụ phân tích tĩnh nào? Có thể bạn nên gửi báo cáo lỗi.

+1

+1 để làm rõ định nghĩa của dàn diễn viên –

+0

+1 từ tôi cũng vậy. Tôi sẽ cẩn thận hơn với thuật ngữ trong tương lai. – talkaboutquality

4

Công cụ này bị nhầm lẫn bằng cách nào đó. Không có đúc ở đây. Những dấu ngoặc đơn đó chỉ cho biết mức độ ưu tiên.

Các vấn đề liên quan