C 为什么printf会给我以下输出?

C 为什么printf会给我以下输出?,c,C,我正在阅读《C编程语言》一书,并了解如果我有一行代码,如: int c; printf("%d", c = 5); 我将得到一个5的输出,因为c=5具有赋值的RHS值 以类似的方式: int c; printf("%d", c = getchar(c)); 将给我stdin缓冲区中第一个字符的整数值,因为c=getchar具有RHS的值,它只是getchar函数 我在玩它,并使用了以下VS代码: #include <stdio.h> in

我正在阅读《C编程语言》一书,并了解如果我有一行代码,如:

int c;
printf("%d", c = 5);
我将得到一个5的输出,因为c=5具有赋值的RHS值

以类似的方式:

int c;
printf("%d", c = getchar(c));
将给我stdin缓冲区中第一个字符的整数值,因为c=getchar具有RHS的值,它只是getchar函数

我在玩它,并使用了以下VS代码:

#include <stdio.h>

int main()
{
    int c, b;
    printf("%d\t%d", c = (b = 7));
}
我得到的结果是:

七, 6422376

而不是

七, 七,

为什么会这样?第二个输出是相同的值6422376,无论我对b使用什么值,例如b=3。

表达式c=b=7是单个表达式,因此是传递给printf函数的单个参数

第二个%d格式说明符导致出现错误,因为没有与之匹配的第二个参数。

表达式c=b=7是一个表达式,因此是传递给printf函数的一个参数


第二个%d格式说明符导致出现错误,因为没有第二个参数与之匹配。

您的代码格式不正确:当您应该有两个参数时,printf只有一个参数。

您的代码格式不正确:当您应该有两个参数时,printf只有一个参数。

因为对于第二个%d,没有匹配的参数因为c=b=7是一个表达式,所以第二个%d没有匹配的参数,因为c=b=7是一个表达式

#include <stdio.h>

int main()
{
    int c, b;
    printf("%d\t%d", c = (b = 7),b);
}
您可以尝试使用这些代码打印b的值。printf函数中只有一个参数和两个格式说明符,所以编译器为另一个%d假设任何垃圾值


您可以尝试使用这些代码打印b的值。printf函数中只有一个参数和两个格式说明符,因此编译器假定另一个%d的垃圾值。

您只打印一个数字,而不是两个数字。当printf尝试读取第二个数字时,它会读取内存中的随机值。Re“赋值的RHS值”:通常,赋值表达式的值是赋值后左操作数的值。例如,给定无符号字符x;具有八位字节或整数y;,x=356的值是100,y=3.5的值是3。您只打印一个数字,而不是两个数字。当printf尝试读取第二个数字时,它会读取内存中的随机值。Re“赋值的RHS值”:通常,赋值表达式的值是赋值后左操作数的值。例如,给定无符号字符x;具有八位字节或整数y;,x=356的值是100,y=3.5的值是3,谢谢!我知道现在只有一个逗号,所以只有一个值。b可能是内存中已分配的某个随机值或未定义的行为。@BenHall-问题不在于b,而是根本没有与第二个%d转换说明符对应的参数。printf需要两个值,但您只传递了一个c=b=7的结果,因此它从第二个值的位置获取一些垃圾值。谢谢!我知道现在只有一个逗号,所以只有一个值。b可能是内存中已分配的某个随机值或未定义的行为。@BenHall-问题不在于b,而是根本没有与第二个%d转换说明符对应的参数。printf需要两个值,但您只传递了一个c=b=7的结果,因此它从它期望的第二个值的位置获取一些垃圾值。这是未定义的行为,因为参数是按未指定的顺序计算的,和b可能在初始化之前求值。这是未定义的行为,因为参数是按未指定的顺序求值的,而b可能在初始化之前求值。