Để thực hiện gói f0
và f1
vào cùng một byte, chương trình bên dưới có được xác định không?Các trường bit và các số thứ tự
struct S0 {
unsigned f0:4;
signed f1:4;
} l_62;
int main (void) {
(l_62.f0 = 0) + (l_62.f1 = 0);
return 0;
}
Tôi quan tâm đến câu trả lời cho C99 và C11 nếu có lý do để nghĩ rằng nó khác ở đó.
Trong C99, tất cả tôi tìm thấy là 6,5: 2:
Giữa điểm chuỗi trước và bên cạnh một đối tượng có trách nhiệm giá trị được lưu trữ Modi fi ed của nó tối đa một lần bởi việc đánh giá một biểu thức. [...]
Tôi không rõ hậu quả của đoạn này trong chương trình ở trên.
Dựa trên một số lượng lớn các thử nghiệm ngẫu nhiên, hầu hết các trình biên dịch xuất hiện để tạo mã nơi hai bài tập không can thiệp.
Những phần đó của tiêu chuẩn cho tôi đau đầu. Đọc hiện tại của tôi là ý định là UB (ví dụ rõ ràng trong C11 rằng sửa đổi hai lĩnh vực trong hai chủ đề là một khóa học không đồng bộ), nhưng ngôn ngữ trong 6,5 quên đề cập đến bit-lĩnh vực như trong khác nơi các trường bit có xử lý đặc biệt. – AProgrammer
@AProgrammer: Đoạn mã trên có ý nghĩa lôgic rõ ràng (xử lý ghi như thể xảy ra tuần tự, theo thứ tự) và không có lý do tại sao trình biên dịch có tác giả không bị lạm dụng sẽ không tạo mã tạo ra hành vi đó trong trường hợp đơn luồng. Bạn có thể đề xuất bất kỳ lý do chính đáng nào tại sao các tác giả của Tiêu chuẩn có thể dự định trở thành UB không? – supercat