2010-01-15 28 views
8

Mã sau có gọi UB không?Mã sau có gọi UB không?

int main(){ 
    volatile int i = 0; 
    volatile int* p = &i; 
    int j = ++i * *p; 
} 
+4

@Prasoon: Bạn không được quyền chỉnh sửa bài đăng của người khác chỉ để định dạng mã của họ bằng kiểu thụt lề ưa thích của bạn. Bạn chưa đọc nguyên tắc StackOverflow - "Tôn trọng tác giả gốc"? (> _ <) –

Trả lời

6

Có được Không xác định hành vi bởi vì bạn đang cố gắng để vi phạm các quy tắc thứ hai ..

Tiêu chuẩn nói rằng

1) Giữa các điểm trình tự trước và bên cạnh một đối tượng có trách nhiệm của mình giá trị được lưu trữ được sửa đổi nhiều nhất một lần bằng cách đánh giá biểu thức.

2) Hơn nữa, giá trị trước chỉ được truy cập để xác định giá trị được lưu trữ.

Note: Trình tự đánh giá của các toán hạng của * điều hành là không xác định*p là gì, nhưng i.

+0

Bạn có nghĩa là '*' nhà điều hành tôi đoán ... –

+0

Vâng typo: P ....... đã chỉnh sửa bài đăng của tôi :) –

+1

@Prasoon: Bạn không được quyền chỉnh sửa bài đăng của người khác chỉ để định dạng mã của họ với yêu thích của bạn phong cách của thụt đầu dòng. Bạn chưa đọc nguyên tắc StackOverflow - "Tôn trọng tác giả gốc"? (> _ <) –

9

Có - hoặC++ i hoặc * p (là i) có thể được đánh giá trước.

+0

nhưng bất kể thứ tự đánh giá kết quả sẽ như thế nào? –

+1

No. Nếu ++ tôi được đánh giá trước, bạn có 1 * 1. Nếu * p được đánh giá trước, bạn có 1 * 0. –

+0

Rất tiếc! Làm thế nào tôi có thể không nhận thấy điều đó! Cảm ơn bạn đã trả lời! –

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