2012-04-05 34 views
5

Hãy xem xét các đoạn mã sau:Sử dụng hợp lệ toán tử có điều kiện?

int i, k, m; 
k = 12; 
m = 34; 
for (i = 0; i < 2; i++) ((i & 1) ? k : m) = 99 - i; 
printf("k: %ld m: %ld\n\n", k, m); 

Trong ví dụ ngớ ngẩn này, khái niệm nhà điều hành có điều kiện là một phím tắt cho:

if (i & 1) k = 99 - i; else m = 99 - i; 

trình biên dịch của tôi không phàn nàn và thực hiện các đoạn mã này cung cấp cho các sản lượng được mong đợi

k: 98 m: 99 

Câu hỏi của tôi, liệu đây có phải là mã hợp lệ theo tiêu chuẩn C không? Tôi chưa bao giờ thấy bất cứ điều gì giống như nó được sử dụng trước đây.

+0

Nếu nó biên dịch và thực hiện như mong đợi, sau đó nó có khả năng hợp lệ nhất. Tuy nhiên, bạn nên tự hỏi mình nếu bạn muốn duy trì mã như thế, đặc biệt nếu nó không được xúc động trong một vài năm và bạn phải giải thích nó sẽ làm gì khi bạn quay trở lại 5 năm xuống đường. –

Trả lời

8

Footnote 110 trong tiêu chuẩn C11:

Một biểu thức điều kiện không mang lại một giá trị trái.

Và 6.5.16 đoạn 2:

Một toán tử gán sẽ có một giá trị trái sửa đổi như toán hạng trái của nó.

Vì vậy, không, mã đó không tuân thủ tiêu chuẩn C.

Trong C++ 11, nó hợp lệ:

Nếu toán hạng thứ hai và thứ ba là lvalues ​​và có cùng loại, kết quả là loại đó và là một giá trị trái.

Vì vậy, đây là một trong những góc bụi khác nơi C và C++ khác nhau đáng kể. Nếu trình biên dịch của bạn không tạo ra lỗi, thì tôi đoán bạn đang sử dụng trình biên dịch C++ với "chế độ C", chứ không phải trình biên dịch C thích hợp; MSVC?

+1

Tôi nghĩ rằng đó là hợp lệ C + + mặc dù. – hugomg

+0

Tôi đã biên dịch nó thành mã C++, có, không phải trong "chế độ C" với MSVC++ 6.0. Tôi đã không cố gắng biên dịch nó trong chế độ C. Ngay cả khi nó là hợp lệ, cho dù trong C hoặc trong C++, tôi thậm chí không có ý định sử dụng nó; nó chỉ là một cái gì đó tôi đã đưa ra trong khi tôi đã suy nghĩ về cách mã những gì tôi muốn chương trình để làm và tôi đã trở nên tò mò về giá trị của nó. Cảm ơn vì đã trả lời! – zarulad

+0

@zarulad: vui lòng trợ giúp! –

1

Nó có giá trị sử dụng có điều kiện như một lval trong C++, nhưng không phải trong C.

Trong C++ (IEC ISO 14882: 1998 (E) 5.16.4)

Nếu thứ hai và toán hạng ba là các giá trị và có cùng loại, kết quả là loại đó và là một giá trị.

gợi ý Nếu bạn muốn sử dụng thủ thuật tương tự như trong C, bạn nên sử dụng:

ISO/IEC 9899: TC2, 6.5.14.6

Nếu cả hai toán hạng thứ hai và thứ ba là con trỏ hoặc một là một hằng số con trỏ null và con trỏ khác là một con trỏ, kiểu kết quả là một con trỏ đến một loại có đủ điều kiện với tất cả các loại vòng loại của các loại được trỏ tới bởi cả hai toán hạng.

*((i & 1) ? &k : &m) = 99 - i; 
+0

Còn câu hỏi của @StephenCanon thì sao? –

+0

@PavanManjunath Tôi đã nhầm lẫn C và C++ một lần nữa. Tôi đã cập nhật câu trả lời của mình để phản ánh điều đó. Cảm ơn! – dasblinkenlight

4

Đây không phải là hợp pháp C và trình biên dịch chấp nhận sai.Tuy nhiên, bạn có thể làm điều tương tự với:

*((i & 1) ? &k : &m) = 99 - i; 

và nó trở thành quy phạm pháp luật C.

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