【发布时间】:2013-03-21 20:20:15
【问题描述】:
请帮我处理这个程序的输出。为什么显示结果
o/p PRINT 2 8 用于输入 3 4
我认为输出可能因机器而异,但这是怎么回事。
#include<stdio.h>
int main() {
int i,a;
printf("%d",printf("PRINT %d\t",scanf("%d%d,",&i,&a)));
return 1;
}
【问题讨论】:
请帮我处理这个程序的输出。为什么显示结果
o/p PRINT 2 8 用于输入 3 4
我认为输出可能因机器而异,但这是怎么回事。
#include<stdio.h>
int main() {
int i,a;
printf("%d",printf("PRINT %d\t",scanf("%d%d,",&i,&a)));
return 1;
}
【问题讨论】:
printf() 执行立即输出。它不会“返回”您刚刚打印的字符串。它返回输出了多少个字符(你的7)。如果您希望将内部打印件送入外部打印件,则需要改用sprintf()。 "字符串 printf"。
【讨论】:
我认为您缺少的是,您的嵌套函数调用的一行与此代码基本相同:
int scanf_result = scanf("%d%d,",&i,&a);
int printf_result = printf("PRINT %d\t", scanf_result));
printf("%d", printf_result);
scanf 调用应该返回 2 如果你输入了有效的输入,但也可以返回 -1 表示实际错误,或者如果它未能扫描 2 个整数,则返回 0 或 1。然后由第一个 printf 打印,如您所料,它应该返回 8(如果 scanf 返回 -1,则返回 9),因此 7 可能意味着您实际执行的代码与您粘贴的代码之间的差异。 . 然后 2nd printf 在同一行打印该数字(没有任何地方打印换行符),为您提供最终输出。
没有歧义,编译器不能在这里以不同的顺序做事。当您将函数的返回值作为参数传递给另一个函数时,必须首先调用第一个函数以获取返回值。因此,任何“副作用”(例如从标准输入读取或打印到标准输出)也会按此顺序发生。
获得歧义的方法是对同一参数列表中的同一变量多次使用赋值运算符或++ 或-- 运算符。然后,当变量值实际发生变化时,它是未定义的,因此当您在同一个参数列表中多次使用同一个变量时,哪些值会被传递。
【讨论】:
任何好的 C 参考资料,例如 Linux printf 和 scanf 手册页,都会记录标准函数的返回值,例如,当你打印出它们的返回值时,你会看到什么。
在这种特定情况下,scanf 的返回值是成功匹配的输入项数。每个“输入项”对应于scanf 字符串中的% 模式,因此在这种情况下,如果scanf 对两种模式都有有效输入,它将返回2。然后,printf 返回它输出的字符数。 (在这种情况下,报告的输出令人惊讶,因为我期望 8:strlen("PRINT ") == 6,加上一个用于 scanf 的返回字符,再加上一个用于选项卡的字符。)
我看不出为什么这些值中的任何一个会因系统而异,尽管如果scanf 无法匹配其两个输入项,它当然会发生变化。
【讨论】: