C 为什么第二个print语句从void函数获得返回值?

C 为什么第二个print语句从void函数获得返回值?,c,void,C,Void,我在我的书中到处都找不到这个问题的答案。第二个printf语句打印x:75y:0,我不知道为什么。请帮忙 #include<stdio.h> Int scaleBack(int); Void setValues(int*, int*, int); Int main() { Int x = 75; Int y = 17; Int factor; Factor = scaleBack(x / y); setValues(&x, &am

我在我的书中到处都找不到这个问题的答案。第二个printf语句打印x:75y:0,我不知道为什么。请帮忙

#include<stdio.h>

Int scaleBack(int);
Void setValues(int*, int*, int);

Int main()
{
    Int x = 75;
    Int y = 17;
    Int factor;

    Factor = scaleBack(x / y);
    setValues(&x, &y, factor);

    printf(“factor: %d\n”, factor);
    printf(“x: %d y: %d\n”, x, y);

    return(0);
}

Int scaleBack(int quotient)
{
    Int fact;

    Fact = (quotient + 2) % (quotient + 1);

    Return(fact);
}

Void setValues(int *ax, int *ay, int factor)
{
    *ax = *ax * factor;
    *ay = *ay * (1 – factor);
}
#包括
整数回缩(Int);
无效设置值(int*,int*,int);
Int main()
{
Int x=75;
Int y=17;
智力因素;
系数=回缩(x/y);
设置值(&x和&y,系数);
printf(“系数:%d\n”,系数);
printf(“x:%d y:%d\n”,x,y);
返回(0);
}
整数回缩(整数商)
{
事实;
事实=(商+2)%(商+1);
返回(事实);
}
无效设置值(int*ax、int*ay、int因子)
{
*ax=*ax*因子;
*ay=*ay*(1-系数);
}
在此代码之后

Factor = scaleBack(x / y);
因子的值为1

您正在将(75,17,1)传递给
setValues
例程。因此声明

*ay = *ay * (1 – factor);
将解析为*ay=17*(1-1),即0


*ay的值将为0,系数将为1:
x/y
为75/17,即4。您可以调用伸缩(4),它计算(4+2)%(4+1)=6%5=1

随后,
setValues()
y
设置为0,原因如下:

*ay = *ay * (1 – factor);
因为
1-因子
为零。由于
ay
指向y,
y
获取值0
x
保持不变,因为
setValues
将其乘以1

setValues
没有返回,但它正在操作
main()
中的局部变量,因为您将指针传递给了
x
y
。因此,对
*ax
*ay
所做的修改在
设置值
之外可见
(商+2)%(商+1)
的值对于
的每个正值为1


因此,您对函数
scaleBack
的调用返回1,对函数
setValues
的调用将
y
设置为0。

。你真幸运@EdHeal你在哪里看到UB?这不是我的代码,它在学习指南上,我输入了它。我觉得不应该返回值,但返回值必须有一个原因。您的代码甚至不会编译,问题已经编辑过了。仍然不能用所有那些大写字母编译