2010-10-18 45 views
23

Gần đây tôi đã tìm hiểu về toán tử , và thực tế là nó giới thiệu một điểm chuỗi .i = 0, ++ i được xác định?

Tôi cũng học được rằng đoạn mã sau dẫn đến hành vi undefined:

i = ++i; 

i đã được sửa đổi hai lần giữa hai điểm theo thứ tự.

Nhưng còn các mã sau thì sao?

i = 0, ++i; 
i = (0, ++i); 

Trong khi tôi biết các quy tắc, tôi không thể đi đến kết luận. Vì vậy, nó được xác định hành vi hay không?

chỉnh sửa: Cũng như @paxdiablo đề cập, xác định hoặc không, đây thực sự là một xấu thực hành mà nên tránh. Câu hỏi này chỉ được yêu cầu cho mục đích giáo dục và hiểu rõ hơn về "quy tắc".

+21

Tôi không biết _why_ mọi người tiếp tục đặt câu hỏi như thế này. Nó không quan trọng cho dù đó là không xác định, đó là mã crappy. Bạn nên _never_ sử dụng nó, được xác định hoặc cách khác. – paxdiablo

+10

@paxdiablo: Bạn có thực sự nghĩ rằng tôi muốn sử dụng một tuyên bố vô dụng trong mã thực sự?! Nó chỉ là về sự hiểu biết các quy tắc tốt hơn. Chỉ có bấy nhiêu thôi. – ereOn

+0

@ereOn rất tốt để tìm hiểu các quy tắc, đó là sự thật. Nhưng sau một thời gian kinh nghiệm thường dẫn các lập trình viên để tránh bất kỳ cấu trúc nào không được xác định rõ và sử dụng phổ biến trên tất cả các nền tảng. –

Trả lời

27

Có. = có mức độ ưu tiên cao hơn ,, vì vậy biểu thức này tương đương với (i = 0), ++i. , là một điểm chuỗi, do đó, đảm bảo rằng ++i xảy ra sau khi gán.

Tôi không chắc chắn liệu i = (0, ++i) có được xác định hay không. Tôi đoán là không; không có điểm chuỗi giữa gia số và bài tập.

+0

Tôi đã đưa ra cùng một trực giác nhưng thực tế tôi không thể chắc chắn làm phiền tôi rất nhiều. Cảm ơn. – ereOn

+0

@ereOn: Trực giác của tôi là bởi vì tiêu chuẩn không đảm bảo nó, nó không xác định. –

+0

Vì các dấu ngoặc đơn, số gia tăng sẽ được đánh giá trước khi gán, vì vậy tôi cũng nghĩ rằng nó sẽ không được xác định. – codymanix

7
i = 0, ++i; 

Như câu trả lời khác đã chỉ ra đó không phải là Hành vi không xác định.

i = (0, ++i); 

Hành vi này không xác định trong trường hợp này vì không có điểm chuỗi giữa ++i và gán cho i.

i = (0, ++i, 0) 

Các hành vi được xác định rõ trong C++ 03, IMHO.

Xem extended discussion để có biểu thức tương tự.

+1

+1. Đơn giản và chính xác. – Nawaz

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