我试图理解下面代码中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;
}
答案 0 :(得分:0)
printf
函数将格式字符串作为第一个参数,然后是零个或多个其他参数。格式字符串中以%
开头的每个事物都对应于其他参数之一。至少你使用它的方式,它们的顺序是相同的,所以第一个%
占位符对应于第二个参数(即格式字符串后的第一个),第二个%
占位符下一个等等。 %
后面的字母(有时是其他字符)描述了参数的类型以及它的打印方式。有关详情,请参阅printf()
的{{3}}。
在调用printf
之前评估每个参数。 C标准没有指定参数的计算顺序。因此,如果你有(例如)!x || y && !z
作为参数,那么每个参数都会在调用printf()
之前进行评估。有关评估这些组件的组件的顺序,请参阅manual page。
请注意,这只会告诉您评估运算符的顺序(即在x + z * y
中,这表示在z * y
之前评估+
)。它不会告诉您是先评估x
,y
还是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值高一个。