【发布时间】:2016-09-12 13:41:55
【问题描述】:
以下代码编译没有问题:
int main() {
printf("Hi" "Bye");
}
但是,这不会编译:
int main() {
int test = 0;
printf("Hi" (test ? "Bye" : "Goodbye"));
}
这是什么原因?
【问题讨论】:
-
字符串连接是早期词法分析阶段的一部分;它不是 C 的表达式 synatx 的一部分。换句话说,没有“字符串文字”类型的 value。相反,字符串字面量是源代码中形成值的词法元素。
-
只是为了澄清@KerrekSB 的答案 - 字符串的连接是代码文本 prior 编译它的预处理的一部分。在运行时计算三元运算符时,在编译代码之后(或者如果一切都是常量,则可以在编译时完成)。
-
详细信息:在这篇文章中,
"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"]——是的,这很可怕),右方括号),右大括号}(在初始化程序中或类似的上下文),分号;是合法的(和另一个字符串文字);我不确定还有其他人。
标签: c string syntax concatenation conditional-operator