Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在参数列表中调用scanf以打印_C_Printf - Fatal编程技术网

在参数列表中调用scanf以打印

在参数列表中调用scanf以打印,c,printf,C,Printf,当我执行以下代码时: #include <stdio.h> int main(void) { int i=10; printf("%d",i,scanf("%d",&i)); return 0; } 如果用户输入正确,则输出为1(表示整数类型)。 为什么每次执行scanf时,输出都不是10?在为printf提供两个参数时,只显示一个数字,因此忽略第二个参数 在第一种情况下,您只显示i,但它被scanf修改(我相信这实际上是未定义的,可以在调用sca

当我执行以下代码时:

#include <stdio.h>

int main(void) {
    int i=10;
    printf("%d",i,scanf("%d",&i));
    return 0;
}
如果用户输入正确,则输出为1(表示整数类型)。
为什么每次执行scanf时,输出都不是10?

在为printf提供两个参数时,只显示一个数字,因此忽略第二个参数

在第一种情况下,您只显示i,但它被scanf修改(我相信这实际上是未定义的,可以在调用scanf之前对我进行求值)


在第二种情况下,显示成功分配的项目数(1)。

如果您的目标是打印用户键入的数字,请先调用
scanf()
,然后调用调用
printf()
。不要把一个嵌套在另一个里面

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

您的程序调用未定义的行为
scanf()
返回成功读取的项目数。

对于两个
int
参数,您在
printf()
中只使用了一个格式说明符

必须将printf参数的数量与输出格式化程序的数量匹配,否则会发生奇怪的事情。

printf中的参数数量不匹配

改变

printf("%d",scanf("%d",&i),i);


你看过scanf上的文件了吗?你为什么希望这能奏效?此外,参数的求值顺序未定义,因此您不能使用依赖于之前求值的不同参数的参数。您的
printf()
调用在某种程度上是可疑的,因为该格式只打印一个数字,部分原因是您正在调用未定义的行为,这取决于函数参数的求值顺序,部分原因是如果
scanf()
失败,您正在打印未初始化的变量。scanf不会返回字符总数……您所说的是printf中的printf。-1:
scanf()
返回成功匹配和分配的项目数,或
EOF
。使用过多的参数调用
printf()
不是未定义的行为(相反,使用太少的参数调用
printf()
是未定义的行为)。如果要提到未定义的行为,那应该与评估的顺序有关;对于
scanf()
,您所说的是不正确的
printf()
返回写入的字符数
scanf()
返回分配成功转换的转换规范的数量(不计算分配但不转换任何内容的
%n
转换规范)。@FilipeGonçalves;对不起。现在编辑。谢谢你,先生。但我想知道它背后的原因。@DivyadeepBhalla:当你调用未定义的行为时,任何事情都可能发生,这是正常的——这是允许的,因为所需的行为是未定义的。这就是为什么避免未定义的行为如此重要的原因。我们没有充分的理由解释为什么。这只是编译器的工作方式。是的,C非常好,它允许您将其他语言所需的操作组合为单独的语句,但您不能滥用它(您所做的就是滥用它)。
printf("%d",scanf("%d",&i),i);
printf("return value of scanf: %d, i: %d",scanf("%d",&i),i);