c 将 scanf 与另一个变量一起嵌套在 printf 中

问题描述 投票:0回答:1

我写了以下c代码

代码1

#include <stdio.h>

int main() {
    int z = 9;
    printf("%d\n", printf("%d%d", scanf("%d", &z), z));
    return 0;
}

代码2

#include <stdio.h>

int main() {
    int z = 9;
    printf("%d\n", printf("%d%d", z, scanf("%d", &z)));
    return 0;
}

对于它们两个,我输入了 2 个输入“1”和“a”来查看输出如何变化。结果如下:

输入 代码1 代码2
1 192 112
a 092 902

据说

C
中参数的求值顺序是未指定的,但是是什么导致了这种行为呢?我还尝试过使用超过 1 个变量和所有可能的订单。

在我看来,评估是从右到左的。我可能是错的,只是想知道它是如何完成的。

c function printf scanf variadic-functions
1个回答
0
投票

据说C中参数的求值顺序是未指定的

这是正确的。它们可以按实现选择的任何顺序进行评估。因此,您不应编写依赖于以任何特定顺序求值的函数参数的代码。

虽然此代码表现出未指定的行为,但它“不”表现出未定义的行为。这是因为调用 scanf 的参数的计算包含调用函数时的序列点(以及函数内部的每个语句),因此

z
不会在没有序列的情况下被读写点。
如果你这样做:

int rval = scanf("%d", &z); printf("%d\n", printf("%d%d", rval, z));

它将打印读取的项目数和读入的值(假设实际上已读入),以供内部调用
printf

    

© www.soinside.com 2019 - 2024. All rights reserved.