2012-06-25 24 views
8

Tôi biết rằng viết một cái gì đó giống nhưCác điểm chuỗi xuất phát từ đâu?

++a = a++; 

là không chỉ đọc mà còn vi phạm điểm c/C++ chuỗi.

Những giới hạn này đến từ đâu? Làm sao người ta có thể thấy 'vấn đề' đó trước khi tìm ra chúng như là lỗi?

+0

Vâng, vẫn còn, đó là giới hạn thiết kế ngôn ngữ hay đúng hơn là giới hạn máy (cpu), phổ biến với bất kỳ ngôn ngữ nào? –

+5

'lỗi: thao tác trên 'a' có thể không xác định [-Werror = sequence-point]' - Ah, cảm ơn bạn, trình biên dịch tiện dụng. – chris

+1

Bật tất cả các cảnh báo của bạn và biên dịch và xử lý các cảnh báo như các lỗi logic mà chúng đang có và bạn sẽ không cần phải lo lắng về điều này: '-Werror -Wall -Wextra -ansi -pedantic' –

Trả lời

8

Về cơ bản, có một điểm chuỗi C++ 03 giữa mỗi câu lệnh. Để biết thêm thông tin, hãy xem SO C++ FAQ. Để biết thêm thông tin, hãy tham khảo tiêu chuẩn C++ và ghi nhớ rằng trong các điểm chuỗi tiêu chuẩn C++ 11 đã được thay thế bằng được sắp xếp trước khiđược sắp xếp theo sau mối quan hệ.

Để tránh các sự cố, chỉ cần không cố gắng quá thông minh về việc thực hiện rất nhiều trong mỗi biểu thức.

Đừng cố gắng thực hiện công việc của trình biên dịch: hãy để điều đó cho trình biên dịch. Công việc của bạn là viết mã mà người khác có thể dễ dàng hiểu, tức là mã rõ ràng. Nhiều cập nhật và sử dụng không cần thiết của các nhà khai thác với các tác dụng phụ không tương thích với điều đó.

Mẹo: rắc const ở mọi nơi có thể.

Điều đó hạn chế các thay đổi trạng thái có thể có mà người đọc phải tính đến.

+0

Cảm ơn bạn đã trả lời. Tôi ước tôi có thể 'chấp nhận' nhiều câu trả lời ở đây;) –

4

How can one see those 'problems' before finding them as bugs?

Biên dịch chương trình của bạn với mức độ nghiêm ngặt và cho phép cài đặt cho tất cả cảnh báo được chỉ ra là lỗi. Hầu hết các trình biên dịch chính thống đều chỉ ra lỗi Undefined Behavior do các điểm chuỗi.

Với gcc bạn có thể sử dụng:

-Wsequence-point 

mà sẽ chỉ ra vấn đề điểm tự. Lưu ý rằng nó được kích hoạt theo mặc định nếu bạn sử dụng -Wall.

Tất nhiên, cách tốt nhất là thử và viết mã dễ đọc hơn, tránh điểm chuỗi các cuộc phiêu lưu sai.

+2

@chris: '-Wall' bật theo mặc định, như tôi đã đề cập. –

+0

Thật vậy, tôi đã hiểu sai. – chris

+0

+1 cho tùy chọn '-Queen-point'. Tôi không biết về nó. – Nawaz

7

Chúng đến từ tiêu chuẩn C hoặc C++, có hiệu quả liệt kê sequence points. Trong một vài trường hợp đơn giản, trình biên dịch của bạn có thể cảnh báo bạn rằng bạn đang gọi hành vi không xác định, nhưng không phải trong trường hợp chung.

Tuy nhiên, bạn thường chỉ vi phạm các yêu cầu điểm chuỗi nếu bạn đang viết mã "thú vị" như ví dụ của mình. Các tiêu chuẩn ngôn ngữ có thể áp đặt các ràng buộc cụ thể về mã như thế này (đó là những ngôn ngữ như Java), nhưng không có nhiều ưu điểm và nhược điểm tiềm năng của việc ngăn chặn một số loại tối ưu hóa nhất định.


1. Thuật ngữ đã thay đổi một chút trong C++ 11, nhưng nguyên tắc vẫn chủ yếu là như nhau, tôi nghĩ vậy.

+0

Cảm ơn bạn đã trả lời. Tôi muốn tôi có thể 'chấp nhận' nhiều câu trả lời ở đây;) –

+0

Tôi đã trả lời một câu hỏi trong khi trước đây về sự khác biệt giữa C++ 98 và C++ 11 về điều này: http://stackoverflow.com/a/10655884/365496 – bames53

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