C printf相关查询

C printf相关查询,c,printf,C,Printf,下面是一个使用printf的简单单行程序: void main() { printf("%d%d",printf("Cis"),printf("good")); } 输出: goodCis34 如何解释此输出???Printf返回打印的字符数。“Cis”是3个字符,“good”是4个字符 它还将输出写入流 因此,打印“Cis”并返回3,打印“good”并返回4。执行这些命令的顺序不受保证,因此您将获得“Cisgood”还是“goodCis”的定义尚不明确 然后对外部printf字符串求值,

下面是一个使用
printf
的简单单行程序:

void main()

{
printf("%d%d",printf("Cis"),printf("good"));
}
输出:

goodCis34

如何解释此输出???

Printf返回打印的字符数。“Cis”是3个字符,“good”是4个字符

它还将输出写入流

因此,打印“Cis”并返回3,打印“good”并返回4。执行这些命令的顺序不受保证,因此您将获得“Cisgood”还是“goodCis”的定义尚不明确


然后对外部printf字符串求值,并返回输出“34”。

之所以先打印
good
Cis
,是因为在调用顶级
printf()
之前需要对参数求值

然后输出返回值


请注意,C没有指定参数的计算顺序。语句中没有序列点。因此,顺序是未定义的。结果可以以任何顺序出现。(因此,在本例中,它们的评估顺序似乎不正确)

它从右到左进行评估,这意味着先打印好。然后对第二部分进行计算,Cis

最后,在执行最左边的操作时,它将使用这两个字符串的各自长度来填充%d替换

printf("%d%d",printf("Cis"),printf("good"));
首先,对参数进行评估。 首先评估printf(“良好”)。打印“良好”,并返回4(写入的字符数)。然后,计算printf(“Cis”)。打印“CI”,并返回3。评估后,该函数如下所示: printf(“%d%d”,3,4)


因此,34被打印。

printf
及其系列返回打印的字符数。在你的例子中,这只是字符串的长度。但是,参数的计算顺序未指定。在您的例子中,外部
printf
的第二个参数首先发生。可能完全不同。

好在Cis之前打印,而不是您描述的顺序。您是对的,我看到的答案没有描述评估顺序的句子。我想您是在我做出更改之前开始写评论的(我意识到我遗漏了一些东西).好的,我需要更正问题,看看答案。.我想知道为什么要先打印
good
。如果没有合适的
printf
(或任何具有可变参数数的函数)的原型,这是未定义的行为。然而,重要的一点是,是因为标准没有保证评估顺序,所以实际输出是实现定义的。@dmckee:否,不是实现定义的,根据C99 6.5.2.2未指定。它不是未定义的,只是未指定。差别很大!这可能是一个没有区别的区别。请注意,我没有说这是未定义的行为。我刚才说,命令是未定义的-这意味着任何命令都是允许的。这就等于说顺序是不确定的。如果您不喜欢当前的词汇选择,请随意编辑。