了解c logic printf&贵重物品

时间:2015-01-08 17:39:42

标签: c forms main

我试图理解下面代码中printf数字背后的逻辑。有人可以解释贵重物品的变化吗?首先执行什么符号(||&&!=等等?它在哪个方向执行?

#include <stdio.h>
static float w = 3.9;
short
f (short a, short *b)
{
  a++;
  (*b)++;
  w++;
  printf ("13: %d %d %4.2f\n", a, *b, w);
  return a - *b;
}

int
main ()
{
  short x, y, z, arr[] = { 4, 8, 0, 6 }, *p = arr;
  char m[] = "dcrfvtgb", *pc;

  y = 2;
  z = 3;
  x = (++y != z);
  printf ("1: %d %d %d\n", x, y, z);

  x = y = 6;
  x *= (y = 5);
  printf ("2: %d %d\n", x, y);

  x = 0;
  y = 2;
  z = 7;
  printf ("3: %d %d %d %d\n", !x || y && !z, x, y, z);

  x = 5;
  y = 3;
  printf ("4: %d %d %d\n", x, y, x < y ? x : y);

  y = 0;
  if (y)
    x = 7;
  else
    x = 5;
  printf ("5: %d %d\n", x, y);

  y = 8;
  if (z = (y++ > 8))
    x = 9;
  else
    x = 0;
  printf ("6: %d %d %d\n", x, y, z);

  x = y = 5;
  while (y++ < 5)
    x += y;
  printf ("7: %d %d\n", x, y);

  for (x = y = 5; y < 7; x = y++)
    printf ("8:%d %d\n", x, y);

  for (x = 2, y = 5; y >= 1; x++, y /= 3);
  printf ("9: %d %d\n", x, y);

  printf ("10: %d %d\n", p[2], *(arr + 1));

  x = y = 3;
  z = f (x, &y);
  printf ("11:%d %d %d %4.2f\n", x, y, z, w);

  for (x = y = z = 10; z-- > 9; x *= y);
  printf ("12: %d %d %d\n", x, y, z);

  for (pc = m; *pc; pc++)
    (*pc)--;
  printf ("14: %s %c\n", m + 2, *(m + 1));

  return 0;
}

2 个答案:

答案 0 :(得分:0)

printf函数将格式字符串作为第一个参数,然后是零个或多个其他参数。格式字符串中以%开头的每个事物都对应于其他参数之一。至少你使用它的方式,它们的顺序是相同的,所以第一个%占位符对应于第二个参数(即格式字符串后的第一个),第二个%占位符下一个等等。 %后面的字母(有时是其他字符)描述了参数的类型以及它的打印方式。有关详情,请参阅printf()的{​​{3}}。

在调用printf之前评估每个参数。 C标准没有指定参数的计算顺序。因此,如果你有(例如)!x || y && !z作为参数,那么每个参数都会在调用printf()之前进行评估。有关评估这些组件的组件的顺序,请参阅manual page

请注意,这只会告诉您评估运算符的顺序(即在x + z * y中,这表示在z * y之前评估+)。它不会告诉您是先评估xy还是z;因为他们可能是表达自己,这很重要。所以,例如在:

int
f(int a, int b, int c)
{
    return g(a) + h(b) * i(c);
}

在一般情况下,您无法保证评估g(a)h(b)i(c)的顺序。您只知道评估+*的顺序。

如果您想了解有关评估顺序的更多信息,则需要研究operator precedence

答案 1 :(得分:0)

@abligh说“C标准没有指定评估参数的顺序。”

据我所知,英特尔实现将参数从右向左推入堆栈,这意味着参数从右向左进行评估。

printf ("12: %d %d %d\n", x, z, z++);

在此示例中,z的第一个值在打印时将比打印时的第二个z值高一个。