【问题标题】:understand c logic printf & valuables了解 C 逻辑 printf 和贵重物品
【发布时间】:2015-03-06 22:17:32
【问题描述】:

我试图理解下面代码中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;
}

【问题讨论】:

  • 这比这里更详细而且更详细。你也会得到更好的理解
  • '贵重物品'?也许你的意思是更常见的术语:'变量'

标签: c forms main


【解决方案1】:

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

据我所知,英特尔实现将参数从右到左推送到堆栈上,这意味着参数是从右到左计算的。

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

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

【讨论】:

    【解决方案2】:

    printf 函数将格式字符串作为第一个参数,然后是零个或多个其他参数。格式字符串中以% 开头的每一件事都对应于其他参数之一。至少你使用它的方式,这些是相同的顺序,所以第一个 % 占位符对应于第二个参数(即格式字符串之后的第一个),第二个 % 占位符到下一个等等向前。 %(有时还有其他字符)后面的字母描述了参数的类型以及如何打印。有关详细信息,请参阅manual page for printf()

    在调用printf 之前评估每个参数。 C 标准没有指定评估参数的顺序。因此,如果您有(例如)!x || y &amp;&amp; !z 作为参数,则每个参数都将在调用printf() 之前进行评估。有关这些组件的评估顺序,请参阅operator precedence

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

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

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

    如果你想了解更多关于评估顺序的信息,你需要研究sequence points

    【讨论】:

    • 程序中的每一行是如何产生方程的?谢谢!
    • 我不会为你完成整个程序。你现在已经足够了!
    猜你喜欢
    • 2014-02-14
    • 2017-11-26
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 2016-02-19
    • 2013-10-02
    • 2010-10-05
    • 1970-01-01
    相关资源
    最近更新 更多