printf中的三元运算符

时间:2014-07-02 12:12:01

标签: c syntax printf conditional-operator

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

9 个答案:

答案 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。