我在C中看到了这段代码并运行它:
int i,j;
scanf("%d %d"+scanf("%d %d",&i,&j));
printf("%d %d",i,j);
输入:
1 2 3
输出:
3 2
这是非常意外的(逆序和三个输入)。
请解释一下。
答案 0 :(得分:6)
此:
scanf("%d %d"+scanf("%d %d",&i,&j));
可怕的代码!但是发生了什么?
首先,调用内部scanf。它分别将1和2存储到i
和j
中(这应该是明显的原因)。然后它返回2,因为这是它存储的东西的数量。然后“跳过”外部scanf格式语句的前两个字符,使其成为" %d"
。然后scanf想要从某个地方的输入中存储3
,但是在外部scanf调用中没有给出指向变量的指针。接下来会发生什么?它是未定义的行为,但实际的事实是第二个(外部)scanf调用只是重用(或者,如果你愿意,可以踩踏)传递给第一个(内部)scanf的参数。所以3存储在i
中,就是这样。
答案 1 :(得分:1)
你的代码毫无意义。
您将内部scanf
的返回值添加到传递给外部scanf
的字符串的地址。由于scanf
返回输入的项目数,因此最终会向地址添加2
,从而产生一个字符串,该字符串稍后会开始两个字节(字符)。
内部scanf
将首先运行
然后,外部scanf
将以更短的格式字符串运行。