printf中的三元运算符

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*,我似乎不在我的例子中.

Sha*_*our 7

条件运算符:

i>j?"%50s":"%s"
Run Code Online (Sandbox Code Playgroud)

是一个表达式,必须在可以计算函数调用本身之前对其进行求值.我们可以通过参考草案C99标准部分6.5.2.2 函数调用来看到这一点:

参数可以是任何对象类型的表达式.在准备对函数的调用时,将评估参数,并为每个参数分配相应参数的值.81)

那么条件运算符的评估结果是什么?如果我们转到6.5.15 条件运算符部分,它说(强调我的):

第一个操作数被评估; 评估后有一个序列点.仅当第一个操作数不等于0时才评估第二个操作数; 仅当第一个操作数比较等于0时才评估第三个操作数; 结果是第二个或第三个操作数的值(无论哪个被评估),转换为下面描述的类型.95

所以在任何一种情况下,结果都是一个字符串文字,它将衰减到指向char的指针,满足第一个参数的要求printf.