Mã sau đây biên dịch mà không gặp sự cố:
int main() {
printf("Hi" "Bye");
}
Tuy nhiên, điều này không biên dịch:
int main() {
int test = 0;
printf("Hi" (test ? "Bye" : "Goodbye"));
}
lý do cho điều đó là gì?
"Hi"và "Bye"là chuỗi ký tự , không phải chuỗi được sử dụng trong thư viện tiêu chuẩn C. Với chuỗi ký tự , trình biên dịch sẽ nối "H\0i" "B\0ye". Không giống vớisprintf(buf,"%s%s", "H\0i" "B\0ye");
a (some_condition ? + : - ) b
printf("Hi" ("Bye"));sẽ không hoạt động - nó không yêu cầu toán tử bậc ba; dấu ngoặc là đủ (mặc dù printf("Hi" test ? "Bye" : "Goodbye")cũng sẽ không biên dịch). Chỉ có một số lượng giới hạn mã thông báo có thể theo sau một chuỗi ký tự. Dấu phẩy ,, dấu ngoặc vuông mở, dấu ngoặc vuông [đóng ](như trong 1["abc"]- và vâng, thật khủng khiếp), dấu ngoặc tròn )đóng, dấu ngoặc nhọn đóng }(trong bộ khởi tạo hoặc ngữ cảnh tương tự) và dấu chấm phẩy ;là hợp lệ (và một chuỗi ký tự khác); Tôi không chắc có bất kỳ người khác.