Наступний код компілюється без проблем:
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"]- і так, це жахливо), закрита кругла дужка ), закрита фігурна дужка }(в ініціалізаторі або подібному контексті) та крапка з комою ;є допустимими (і інший буквальний рядок); Я не впевнений, що є інші.