2011-11-05 39 views
7

Có một điểm chuỗi giữa các biểu thức khởi tạo thành viên cấu trúc không? Ví dụ:Có một điểm chuỗi giữa các khởi tạo thành viên cấu trúc không?

Ví dụ, được xác định rõ rằng mã dưới đây sẽ luôn in "a, b"?

#include <stdio.h> 

typedef struct { 
    char *bytes; 
    int position; 
    int length; 
} Stream; 

typedef struct { 
    char a; 
    char b; 
} Pair; 

char streamgetc(Stream *stream) { 
    return (stream->position < stream->length) ? stream->bytes[stream->position++] : 0; 
} 

int main(void) { 
    Stream stream = {.bytes = "abc", .position = 0, .length = 3}; 
    Pair pair = {.a = streamgetc(&stream), .b = streamgetc(&stream)}; 
    printf("%c, %c\n", pair.a, pair.b); 
    return 0; 
} 

Trả lời

6

Tôi nghĩ §6.7.8-23 lắng nó:

Thứ tự mà bất kỳ tác dụng phụ xảy ra trong danh sách khởi biểu là unspeci fi ed.

Và khoảng literals hợp chất:

§6.5.2.5-7

Tất cả các quy tắc ngữ nghĩa và trở ngại cho các danh sách khởi tạo trong 6.7.8 được áp dụng cho các chữ ghép.

1

No. Bạn có thể tự mình thấy trong Phụ lục C của tiêu chuẩn C (hoặc bản nháp n1256, n1516, v.v ...).

Có một điểm chuỗi sau mỗi tờ khai đầy đủ và sẽ vẫn có các điểm trình tự từ các biểu thức bên trong khởi tạo sử dụng && hoặc chức năng gọi.

Không có điểm chuỗi giữa các đối số hàm.

func(getc(), getc()); // who knows what order? 
2

Tôi tin rằng từ ngữ có liên quan trong C99 TC2 (n1124) là trong §6.7.8/23:

Thứ tự mà bất kỳ tác dụng phụ xảy ra một trong những biểu hiện danh sách khởi tạo là không xác định .

Các chú thích nói:

131) Đặc biệt, trình tự thẩm định không nhất thiết phải giống như thứ tự của subobject khởi tạo.

+0

Tôi thích (và bỏ phiếu cho) việc thêm chú thích 131, nhưng tôi đã đi với câu trả lời cũ hơn vì tôi nghĩ cả hai đều đã hoàn thành. –

+0

Điều đó có nghĩa là việc đánh giá các biểu thức liên kết với các phần tử khác nhau được đảm bảo không trùng lặp, nhưng có thể đánh giá bất kỳ số biểu thức nào trong khoảng thời gian được đánh giá hay không. – supercat

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