A.s*_*lar 5 c syntax printf conditional-operator
读完这篇文章后,我开始认为我已经学会了一个战利品printf().突然,我发现从下面的代码片段这本书:
int main()
{
char str[]="Hello";
int i=5,j=10;
printf(i>j?"%50s":"%s",str); //unable to understand this
return 0;
}
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,上面的代码运行没有错误,它打印Hello.根据我的知识,以下是语法printf():
int printf(const char *format,argument_list);
Run Code Online (Sandbox Code Playgroud)
所以根据这种语法,printf()应该从格式字符串开始.但正如您在上面的代码中printf()所看到的那样i>j.
这是否意味着我在解释printf()的语法时出错了?将三元运算符放在printf()中是一种特殊情况吗?
编辑
我知道三元运算符我问的第一个参数printf()应该是const char*,我似乎不在我的例子中.
条件运算符:
i>j?"%50s":"%s"
Run Code Online (Sandbox Code Playgroud)
是一个表达式,必须在可以计算函数调用本身之前对其进行求值.我们可以通过参考草案C99标准部分6.5.2.2 函数调用来看到这一点:
参数可以是任何对象类型的表达式.在准备对函数的调用时,将评估参数,并为每个参数分配相应参数的值.81)
那么条件运算符的评估结果是什么?如果我们转到6.5.15 条件运算符部分,它说(强调我的):
第一个操作数被评估; 评估后有一个序列点.仅当第一个操作数不等于0时才评估第二个操作数; 仅当第一个操作数比较等于0时才评估第三个操作数; 结果是第二个或第三个操作数的值(无论哪个被评估),转换为下面描述的类型.95
所以在任何一种情况下,结果都是一个字符串文字,它将衰减到指向char的指针,满足第一个参数的要求printf.