2010-10-28 27 views
10

Tôi có thể sử dụng x trên cả hai mặt của biểu thức boolean khi tôi sau đó tăng nó ở phía bên trái?Là `x--> 0 && mảng [x]` hành vi được xác định rõ trong C++?

Các dòng trong câu hỏi là:

if(x-- > 0 && array[x]) { /* … use x … */ } 

Đó có phải là định nghĩa thông qua tiêu chuẩn? Sẽ mảng [x] sử dụng giá trị mới của x hoặc giá trị cũ?

+6

hãy nhớ giữ mã của bạn sạch sẽ để người khác đọc, ngay cả khi được xác định rõ ràng nó có thể giới thiệu sự cố nếu ai đó sau đó thay đổi hoặc thêm vào biểu thức. Chỉ cần 2c của tôi –

+5

Thậm chí nếu nó có thể được xác định rõ, bạn không nên sử dụng mã loại như vậy. Bạn có thể hiểu nó khi bạn viết nó, nhưng peson tiếp theo có thể không. – codymanix

+0

mã này không quá tệ sau khi tất cả. Tôi đã thấy mã tồi tệ hơn trong hạt nhân Linux: D – knittl

Trả lời

12

Điều đó tùy thuộc.

Nếu && là toán tử logic ngắn mạch thông thường, thì sẽ tốt vì có một điểm chuỗi. array[x] sẽ sử dụng giá trị mới.

Nếu && là người dùng (hoặc thư viện) đã định nghĩa toán tử quá tải, thì không có đoản mạch và cũng không đảm bảo điểm chuỗi giữa đánh giá x-- và đánh giá array[x]. Điều này có vẻ không được đưa ra mã của bạn, nhưng không có ngữ cảnh thì không thể nói chắc chắn được. Tôi nghĩ rằng nó có thể, với định nghĩa cẩn thận của array, để sắp xếp theo cách đó.

Đây là lý do tại sao luôn luôn là ý tưởng tồi để quá tải operator&&.

Bằng cách này, if ((x > 0) && array[--x]) có hiệu ứng rất giống nhau (một lần nữa, giả sử không có toán tử quá tải shenanigans) và theo ý kiến ​​của tôi rõ ràng hơn. Sự khác biệt là có hay không x bị giảm 0 trong quá khứ mà bạn có thể hoặc không thể dựa vào.

+0

Vì khi nào bạn có thể quá tải 'toán tử &&'? – zwol

+0

đó là toán tử boolean && và nó không bị quá tải – knittl

+0

@Steve: Ngay cả khi && bị quá tải nó vẫn sẽ được xác định hành vi, phải không? –

11

Có, nó được xác định rõ. && giới thiệu một điểm chuỗi.

+1

Huh, tôi có cảm giác rằng bạn hoặc những người khác đang sử dụng một số nguồn cấp dữ liệu như Twitter để trả lời nhanh như vậy. Khi tôi lần đầu tiên nhìn thấy một câu hỏi, nó thường được trả lời ...? –

+0

@Alf P. Steinbach, nhấp vào liên kết "câu hỏi" một lần trong một giây thứ hai – Harmen

+0

@Alf: Khi tôi thấy câu hỏi này, nó đã được trả lời và vì vậy tôi đã trả lời. Bí quyết là: Làm mới trang "Câu hỏi mới" ít nhất một lần trong 10 giây. ';-)' –

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