在阅读this后,我开始认为我已经学会了关于printf()
的战利品。突然之间,我发现了this本书中的以下代码段:
int main()
{
char str[]="Hello";
int i=5,j=10;
printf(i>j?"%50s":"%s",str); //unable to understand this
return 0;
}
令人惊讶的是,上面的代码运行没有错误,它打印Hello。
据我所知,以下是printf()
的语法:
int printf(const char *format,argument_list);
因此,根据这种语法,printf()
应该以格式字符串开头。但正如您在上面的代码中看到的那样printf()
以i>j
开头。
这是否意味着我在解释printf()的语法时出错了?
将三元运算符放在printf()中是一种特殊情况吗?
修改
我知道三元运算符我问的是printf()
的第一个参数,它应该是const char *,我似乎不在我的例子中。
答案 0 :(得分:7)
条件运算符:
i>j?"%50s":"%s"
是一个表达式,必须在可以计算函数调用本身之前对其进行求值。我们可以通过转到草案C99标准部分6.5.2.2
函数调用来看到这一点,其中包含:
参数可以是任何对象类型的表达式。在准备 对函数的调用,参数的计算以及每个参数的计算 参数被赋予相应参数的值。 81)
那么条件运算符的评估结果是什么?如果我们转到6.5.15
条件运算符部分,它会说(强调我的):
评估第一个操作数;它之后有一个序列点 评价。仅在第一个操作数进行比较时才评估第二个操作数 不等于0;第三个操作数仅在第一个操作数时进行评估 比较等于0; 结果是第二个或第三个的值 操作数(取其评估),转换为所描述的类型 下方。 95
所以在任何一种情况下,结果都是一个字符串文字,它会衰减到指向char的指针,满足printf
的第一个参数的要求。
答案 1 :(得分:3)
此代码是正常的,并非特殊情况。 printf
的要求是第一个参数应该是const char*
类型,但它并不一定意味着它需要是"%s"
之类的字符串文字。这意味着您需要将const char*
类型的表达式作为第一个参数传递。 i>j?"%50s":"%s"
符合此要求。
答案 2 :(得分:2)
这是一个三元运算符,在这种条件下i> j是假的,所以%s将作为参数传递给printf,它将打印字符数组的值为hello。
答案 3 :(得分:1)
这是否意味着我在解释printf()的语法时错了?
不,你不是在解释错误。
在printf()中放置三元运算符是一种特殊情况吗?
在C中,你可以说它是一个表达式而不是一个语句
您的代码相当于:
if (i > j)
printf("%50s", str);
else
printf("%s", str);
答案 4 :(得分:1)
三元运算符只是一个内联if
,用作表达式(而常规if
用于创建一个块)。你的行等于:
if (i > j)
printf("%50s", str);
else
printf("%s", str);
答案 5 :(得分:1)
if(i>j)
printf("%50s",str);
else
printf("%s",str);
因此,Hello
会在两种情况下都被打印
答案 6 :(得分:1)
我认为您完全理解printf
语法,但我认为您缺少有关C语法的内容。
它存在一种形式为“紧凑的IF like”的语句格式如下:( condition ? true : false )
例如,你可以这样做:
int a=5;
int b=(a==5 ? 128 : 256);
int c=(a!=5 ? 8 : 9);
在这种情况下,b = 128且c = 9.
另一个例子:
int flag=1;
printf("The value is: %s", (flag!=0 ? "true" : "false) );
在这种情况下,您可以看到:值为true
在你的例子上:
printf(i>j?"%50s":"%s",str);
如果我高于j,则使用“%50s”格式,如果我更低,则使用“%s”格式
它可以像:
if (i>j)
printf("%50s",str);
else
printf("%s",str);
您可以看到紧凑型测试的优势。
答案 7 :(得分:1)
问:这是否意味着我在解释printf()的语法时出错了?
答:不,只需要扩大允许的范围。
问:在printf()中放置三元运算符是一种特殊情况吗?
答:没有?:
并不特别,但有时候乍一看有点令人困惑。
提供给printf()
的格式不一定是文字。它可以是任何字符串变量。
int main() {
char str[]="Hello";
char *format;
int i,j;
i = 5; j = 10;
format = i > j ? "%50s" : "%s";
printf(format, str);
i = 10; j = 5;
format = i > j ? "%50s" : "%s";
printf(format, str);
return 0;
}
答案 8 :(得分:0)
有一种形式的陈述:条件?结果:替代。
检查条件,如果确实如此,您将得到结果。否则你会得到另一种选择。
例如:
5>3 ? 10 : 5
5> 3是真的,所以你会得到10。