2013-04-08 34 views
7

Tôi không có quyền truy cập vào đặc tả C11, do đó tôi không thể điều tra lỗi này.Khởi tạo mảng với toán tử bậc ba?

Việc kê khai sau tăng lên một lỗi trong quá trình biên soạn:

int why[2] = 1 == 1 ? {1,2} : {3,4}; 

Lỗi này là: biểu dự kiến ​​trước {và: biểu dự kiến ​​trước đây:

+2

Bạn đã thử cách này: int why [2] = (1 == 1)? {1,2}: {3,4}; – luckystars

+3

có: điều này làm cho không có sự khác biệt –

+0

Nó không tồn tại trong cú pháp của việc khởi tạo mảng. – BLUEPIXY

Trả lời

9

Đây không phải là C11 hợp lệ.

Bạn chỉ có thể khởi tạo một mảng với danh sách bộ khởi tạo không có biểu thức.

int why[2] = { ... }; // initializer-list {} 

Hơn nữa, 1 == 1 ? {1,2} : {3,4} không phải là cụm C hợp lệ vì {1, 2} không phải là cụm C.

Chỉ cần cung cấp thông tin sử dụng literals hợp chất bạn có thể có một cái gì đó gần với những gì bạn muốn sử dụng một đối tượng con trỏ:

int *why = (1 == 1) ? (int[2]) {1,2} : (int[2]) {3,4}; 
+0

hoạt động: 'int works = 1 == 1? 42: 6 * 7; ' –

+1

@ RudiRüssel có, cái đó là hợp lệ nhưng không có biểu thức' {1, 2} 'ở đây và' tác phẩm' không phải là một mảng. – ouah

+1

@ RudiRüssel: Biểu thức là những thứ có giá trị. '6 * 7' có giá trị. Các danh sách khởi tạo không phải là các biểu thức; chúng chỉ là một cú pháp để mô tả nhiều giá trị được đưa vào đối tượng khi nó được khởi tạo. Mã nguồn '{1, 2}' không phải là một giá trị hoặc một đối tượng hoặc bất cứ điều gì bạn có thể thao tác. Nó chỉ là một mô tả về những gì để đưa vào một mảng. Bởi vì nó không phải là biểu thức, bạn không thể vận hành được nó; bạn không thể sử dụng nó như là một toán hạng trong cho '? : 'hoặc cho các toán tử khác. –

2

từ Charles Bailey trả lời ở đây: Gramma from conditional-expression

conditional-expression: 
     logical-OR-expression 
     logical-OR-expression ? expression : conditional-expression 

1 == 1 ? {1,2} : {3,4}; 
     ^ ^  are not expressions 

đó là lý do trình biên dịch cung cấp lỗi như:

error: expected expression before ‘{’ token // means after ? 
error: expected expression before ‘:’ token // before : 

Sửa như @Rudi Russel nhận xét:

Sau đây là một mã hợp lệ trong c:

int main(){ 
    {} 
    ; 
    {1,2;} 
} 

chúng tôi sử dụng để kết hợp {} báo cáo ; trong C.

lưu ý: nếu tôi viết {1,2} thì s lỗi (*expected ‘;’ before ‘}’ token*), bởi vì 1,2 là một biểu thức nhưng không phải là một tuyên bố.

Đối với OP: những gì là The Expression Statement in C và những gì là Block StatementExpression Statements

edit2:
Lưu ý: Làm thế nào @ouah sử dụng typecase để chuyển đổi nó thành biểu, vâng:

Để hiểu chạy mã này:

int main(){ 
printf("\n Frist = %d, Second = %d\n",((int[2]){1,2})[0],((int[2]) {1,2})[1]); 
} 

Nó hoạt động như:

~$ ./a.out 

Frist = 1, Second = 2 
+0

Đối với sự hiểu biết của tôi: '{1,2}' là gì nếu không phải là một biểu thức? –

+0

@ RudiRüssel khối của nó '{}' của khóa học để kết hợp các câu lệnh –

+1

@ RudiRüssel: '{1, 2}' là một bộ khởi tạo. Điều này được mô tả trong điều khoản 6.7 của tiêu chuẩn C 2011. Biểu thức được mô tả trong một mệnh đề khác, 6.5. –

0

Danh sách trình khởi tạo không phải là biểu thức, vì vậy chúng không thể được sử dụng trong các biểu thức.

Tôi đề nghị bạn để mảng chưa được khởi tạo và sử dụng memcpy.

int why[2]; 
memcpy(why, 1 == 1 ? (int[2]){1,2} : (int[2]){3,4}, sizeof why); 
Các vấn đề liên quan