Наступний код компілюється без проблем:
int main() {
printf("Hi" "Bye");
}
Однак це не компілює:
int main() {
int test = 0;
printf("Hi" (test ? "Bye" : "Goodbye"));
}
У чому причина цього?
"Hi"
і "Bye"
є рядкові літерали , а не рядки, як це використовується в стандартній бібліотеці C. За допомогою рядкових літералів компілятор об’єднається "H\0i" "B\0ye"
. Не те саме зsprintf(buf,"%s%s", "H\0i" "B\0ye");
a (some_condition ? + : - ) b
printf("Hi" ("Bye"));
не буде працювати - для цього не потрібен тернарний оператор; дужок достатньо (хоча printf("Hi" test ? "Bye" : "Goodbye")
також не компілюється). Існує лише обмежена кількість лексем, які можуть слідувати за рядковим літералом. Кома ,
, відкрита квадратна дужка [
, закрита квадратна дужка ]
(як у 1["abc"]
- і так, це жахливо), закрита кругла дужка )
, закрита фігурна дужка }
(в ініціалізаторі або подібному контексті) та крапка з комою ;
є допустимими (і інший буквальний рядок); Я не впевнений, що є інші.