-3

请帮我处理这个程序的输出。为什么它显示输入 3 4 的结果 o/p PRINT 2 8
我认为输出可能因机器而异,但这是怎么回事。

#include<stdio.h>
int main() {
    int i,a;
    printf("%d",printf("PRINT %d\t",scanf("%d%d,",&i,&a)));  
    return 1;
}
4

3 回答 3

1

printf()执行立即输出。它不会“返回”您刚刚打印的字符串。它返回输出了多少个字符(你的7)。如果您希望将内部打印件送入外部打印件,则需要sprintf()改用。“字符串打印”。

于 2013-03-21T20:23:11.977 回答
0

任何好的 C 参考资料,例如 Linuxprintfscanf手册页,都将记录标准函数的返回值,这些函数将解释您在打印出它们的返回值时会看到什么。

在这种特定情况下,返回值scanf是成功匹配的输入项数。每个“输入项”对应%于字符串中的一个模式,因此在这种情况下,如果两个模式的输入都有效scanf,它将返回 2 。scanf然后,printf返回它输出的字符数。(在这种情况下,报告的输出令人惊讶,因为我希望 8:strlen("PRINT ") == 6加上一个用于返回的字符scanf加上一个用于制表符的字符。)

我看不出为什么这些值中的任何一个会从一个系统到另一个系统发生变化,尽管如果scanf不能匹配它的两个输入项,它当然会发生变化。

于 2013-03-21T20:27:41.913 回答
0

我认为您缺少的是,您的嵌套函数调用的一行与此代码基本相同:

int scanf_result = scanf("%d%d,",&i,&a);
int printf_result = printf("PRINT %d\t", scanf_result));
printf("%d", printf_result);

scanf如果您输入了有效输入, call 应该返回 2,但也可以返回 -1 表示实际错误,或者如果未能扫描 2 个整数,则返回 0 或 1。然后printf按照您的预期首先打印它,它应该返回 8(如果scanf返回 -1,则返回 9),因此 7 可能意味着您实际执行的代码与您粘贴的代码之间的差异......然后 2ndprintf打印该数字在同一行(没有任何地方打印换行符),为您提供最终输出。

没有歧义,编译器不能在这里以不同的顺序做事。当您将函数的返回值作为参数传递给另一个函数时,必须首先调用第一个函数才能获取返回值。因此,任何“副作用”(例如从标准输入读取或打印到标准输出)也会按此顺序发生。

获得歧义的方法是在同一参数列表中的同一变量上多次使用赋值运算符或++或运算符。--然后,当变量值实际发生变化时,当您在同一个参数列表中多次使用同一个变量时,它是未定义的,因此传递了哪些值。

于 2013-03-21T20:58:39.460 回答