在参数列表中调用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);