Các đoạn đã giảm
Tệp nguồn được mã hóa trong một tập ký tự vật lý được ánh xạ theo cách được triển khai xác định với tập ký tự nguồn , được định nghĩa trong tiêu chuẩn. Để phù hợp với các ánh xạ từ một số bộ ký tự vật lý vốn dĩ không có tất cả các dấu câu cần thiết cho bộ ký tự nguồn, các đoạn văn được xác định theo ngôn ngữ — chuỗi gồm ba ký tự phổ biến có thể được sử dụng thay cho một ký tự dấu câu ít phổ biến hơn. Bộ tiền xử lý và trình biên dịch được yêu cầu để xử lý những điều này.
Trong C ++ 17, các đồ thị đã bị loại bỏ. Vì vậy, một số tệp nguồn sẽ không được chấp nhận bởi các trình biên dịch mới hơn trừ khi chúng được dịch lần đầu tiên từ bộ ký tự vật lý sang một số bộ ký tự vật lý khác ánh xạ 1-1 sang bộ ký tự nguồn. (Trong thực tế, hầu hết các trình biên dịch chỉ thực hiện việc giải thích các đoạn văn là tùy chọn.) Đây không phải là một thay đổi hành vi tinh tế, mà là một thay đổi đột phá ngăn không cho các tệp nguồn được chấp nhận trước đó được biên dịch mà không cần quá trình dịch bên ngoài.
Nhiều ràng buộc hơn về char
Tiêu chuẩn cũng đề cập đến bộ ký tự thực thi , được xác định việc triển khai, nhưng phải chứa ít nhất toàn bộ bộ ký tự nguồn cộng với một số lượng nhỏ mã điều khiển.
Tiêu chuẩn C ++ được định nghĩa char
là một kiểu tích phân có thể không dấu có thể biểu diễn hiệu quả mọi giá trị trong bộ ký tự thực thi. Với sự trình bày từ một luật sư ngôn ngữ, bạn có thể lập luận rằng a char
phải có ít nhất 8 bit.
Nếu việc triển khai của bạn sử dụng giá trị không được đánh dấu cho char
, thì bạn biết nó có thể nằm trong khoảng từ 0 đến 255 và do đó phù hợp để lưu trữ mọi giá trị byte có thể có.
Nhưng nếu triển khai của bạn sử dụng giá trị đã ký, thì nó có các tùy chọn.
Hầu hết sẽ sử dụng phần bù của hai, cho char
một phạm vi tối thiểu từ -128 đến 127. Đó là 256 giá trị duy nhất.
Nhưng một tùy chọn khác là dấu + độ lớn, trong đó một bit được dành riêng để cho biết liệu số có âm hay không và bảy bit còn lại biểu thị độ lớn. Điều đó sẽ cung cấp char
một phạm vi từ -127 đến 127, chỉ là 255 giá trị duy nhất. (Bởi vì bạn mất một tổ hợp bit hữu ích để biểu diễn -0.)
Tôi không chắc ủy ban đã bao giờ chỉ định rõ ràng đây là một khiếm khuyết, nhưng đó là vì bạn không thể dựa vào tiêu chuẩn để đảm bảo một chuyến khứ hồi từ unsigned char
đi char
và về sẽ giữ nguyên giá trị ban đầu. (Trong thực tế, tất cả các triển khai đều như vậy vì chúng đều sử dụng phần bù của hai cho các loại tích phân có dấu.)
Chỉ gần đây (C ++ 17?) Mới được sửa lại từ ngữ để đảm bảo sự thành thạo. Bản sửa lỗi đó, cùng với tất cả các yêu cầu khác trên char
, bắt buộc một cách hiệu quả phần bù của hai cho char
có dấu mà không cần nói rõ ràng như vậy (ngay cả khi tiêu chuẩn tiếp tục cho phép biểu diễn dấu + độ lớn cho các loại tích phân có dấu khác). Có một đề xuất yêu cầu tất cả các kiểu tích phân có dấu sử dụng phần bù của hai, nhưng tôi không nhớ liệu nó có được đưa vào C ++ 20 hay không.
Vì vậy, điều này tương tự như những gì bạn đang tìm kiếm bởi vì nó cung cấp cho mã quá tự tin không chính xác trước đó một bản sửa lỗi có hiệu lực trở lại.