2013-03-21 31 views
-3

请帮我输出这个程序。为什么它会显示结果 o/p PRINT 2 8用于输入3 4
我认为输出可能因机器不同而不同,但这是怎么回事。嵌套printf和scanf在C中的输出

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

回答

0

我想你缺的是,你有嵌套函数一行调用是因为这个代码基本上相同:

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可能意味着您实际执行的代码与粘贴的代码之间存在差异...然后第二个printf在同一行上打印该数字(不在任何地方打印新行),从而为您提供最终输出。

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

您可以获得ambiquity的方式是在同一个参数列表中的相同变量上多次使用赋值运算符或++--运算符。然后,当变量值实际发生更改时,它是未定义的,因此当您在同一个参数列表中多次使用同一个变量时,哪些值会被传递。

1

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

0

任何优秀的C参考文档(例如Linux printfscanf手册页)都会记录标准函数的返回值,例如这些参数将解释打印返回值时会看到的内容。

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

我看不出为什么无论这些值会从改变系统到系统,但当然如果scanf不能匹配它的两个输入项目,它将会改变。