对C中的scanf()感到困惑?

时间:2011-08-21 03:12:09

标签: c scanf

我在C中看到了这段代码并运行它:

int i,j;
scanf("%d %d"+scanf("%d %d",&i,&j));
printf("%d %d",i,j);

输入:

1 2 3

输出:

3 2

这是非常意外的(逆序和三个输入)。

请解释一下。

2 个答案:

答案 0 :(得分:6)

此:

scanf("%d %d"+scanf("%d %d",&i,&j));

可怕的代码!但是发生了什么?

首先,调用内部scanf。它分别将1和2存储到ij中(这应该是明显的原因)。然后它返回2,因为这是它存储的东西的数量。然后“跳过”外部scanf格式语句的前两个字符,使其成为" %d"。然后scanf想要从某个地方的输入中存储3,但是在外部scanf调用中没有给出指向变量的指针。接下来会发生什么?它是未定义的行为,但实际的事实是第二个(外部)scanf调用只是重用(或者,如果你愿意,可以踩踏)传递给第一个(内部)scanf的参数。所以3存储在i中,就是这样。

答案 1 :(得分:1)

你的代码毫无意义。

您将内部scanf的返回值添加到传递给外部scanf的字符串的地址。由于scanf返回输入的项目数,因此最终会向地址添加2,从而产生一个字符串,该字符串稍后会开始两个字节(字符)。

内部scanf将首先运行 然后,外部scanf将以更短的格式字符串运行。