2013-08-02 50 views
11
const int a = 10 
int *p = (int*) &a; 
*p = 20; 
printf("a = %d", a); 

Có thể xuất 10 hoặc 20, tùy thuộc vào trình biên dịch không?có thể bỏ đi constness dẫn đến hành vi không xác định?

+3

không xác định hành vi – minicaptain

+2

Tôi đưa cho bạn đặt câu hỏi một tiêu đề tóm tắt nội dung của nó. Không sử dụng các tiêu đề chung như bạn đã làm, họ không giúp đỡ bất cứ ai. –

+0

@Jens Gustedt OK. Cảm ơn. – xiaokaoy

Trả lời

3

Khi bạn làm *p=20, bạn đang cố gắng thay đổi giá trị của hằng số, không được phép.

15

Có thể xuất 10 hoặc 20, tùy thuộc vào trình biên dịch không?

Có hoặc thậm chí là ma quỷ có thể xuất hiện. Hành vi của chương trình này là không xác định, mã không đúng định dạng, vì sửa đổi đối tượng const là một vi phạm ràng buộc.

+2

+ cho 'ràng buộc vi phạm' được gọi là const-constraint - Tôi thích các thuật ngữ chính xác . –

+0

@GrijeshChauhan Không liên quan: cảm ơn các liên kết dupe. –

+0

@ H2CO3 Tôi đã đọc những câu trả lời này nhiều lần. Tôi đã có cùng một sự nhầm lẫn trong quá khứ. thực sự câu hỏi là tốt và rõ ràng nhất. –

11

Khi được viết, mã của bạn có hành vi không xác định, vì vậy có, bạn có thể nhận được 10 hoặc 20 hoặc bất kỳ điều gì khác (ví dụ: vi phạm quyền truy cập).

6

Đó là hành vi không xác định:

C11 6.7.3 Loại vòng loại

Nếu một nỗ lực được thực hiện để sửa đổi một đối tượng được xác định với một kiểu const trình độ thông qua sử dụng của một giá trị trái với không const -quyền loại, hành vi là không xác định. Nếu một nỗ lực là được thực hiện để tham chiếu đến một đối tượng được xác định với một loại có đủ điều kiện dễ bay hơi thông qua việc sử dụng một lvalue với loại không đủ điều kiện bay hơi, hành vi không xác định.

6

Vâng, đó là hành vi không xác định và tôi nghĩ đây là nơi được nói về nó.

C99 Mục 6.7.3 Đoạn 5

Nếu một nỗ lực được thực hiện để sửa đổi một đối tượng được xác định với một kiểu const trình độ thông qua sử dụng một giá trị trái với không const trình độ loại, hành vi không xác định. Nếu một nỗ lực được thực hiện để tham khảo một đối tượng định nghĩa với một loại dễ bay hơi có trình độ thông qua việc sử dụng một giá trị trái với kiểu non-volatile có trình độ, hành vi này là undefined.115)