0

我正在尝试测试我最近学到的这种方法(按值调用),但是由于我未知的原因,代码不起作用,有人可以解释一下为什么吗?(顺便说一下乱七八糟的)

#include <stdio.h>
#include <stdlib.h>

void fact(int i);


int main() {
   int x;

   scanf("%d", x);
   //function called:

   fact(x);

   printf("value of x! = %d", x);

   return 0;
}


//factorial definition:
void fact(int i){
   int j=0;
   for(i=1; j>1; j--){
      i= i * j;
      return;
   }
}
4

3 回答 3

4

如果您使用按值调用函数来使用传递的参数进行计算,那么要在调用者中获取计算结果,该函数必须返回一个值。那就是它的返回类型不应该是void.

函数的定义fact没有意义。在 for 循环中,参数i被重新分配给1. 循环本身从不迭代,因为另一个变量j设置为0. 所以它不能大于1

int j=0;
for(i=1; j>1; j--){

该函数可以通过以下方式定义

//factorial definition:
unsigned long long int fact( unsigned int i )
{
    unsigned long long int f = 1;

    while ( i > 1 ) f *= i--;

    return f;
}

阶乘是为无符号自然整数定义的。

在 main 中,您需要声明一个 unsigned int 类型的变量,例如

unsigned int x;

这个呼唤scanf

scanf("%d", x);

是不正确的。该函数需要通过引用来接受其整数参数才能更改它。

scanf( "%u", &x );

要获得函数的结果,fact您必须再引入一个变量

unsigned long long int result = fact( x );

并输出它你应该写

printf( "value of %u! = %llu\n", x, result );

这是一个演示程序。

#include <stdio.h>

unsigned long long int fact( unsigned int );

int main(void) 
{
    unsigned int x;

    scanf( "%u", &x );

    unsigned long long int result = fact( x );

    printf( "value of %u! = %llu\n", x, result );

    return 0;
}

//factorial definition:
unsigned long long int fact( unsigned int i )
{
    unsigned long long int f = 1;

    while ( i > 1 ) f *= i--;

    return f;
}

如果输入数字,20那么函数输出将是

value of 20! = 2432902008176640000

请注意,它20的阶乘可以存储在 type 的对象中的最大数量unsigned long long int

如果您希望函数通过引用接受其参数并在参数中返回结果,那么您必须将变量声明x为具有 unsigned long long int 类型。

这是一个演示程序。

#include <stdio.h>

void fact( unsigned long long int * );

int main(void) 
{
    unsigned long long int x;

    scanf( "%llu", &x );

    printf( "value of %llu! = ", x );
    fact( &x );
    printf( "%llu\n", x );

    return 0;
}

//factorial definition:
void fact( unsigned long long int *x )
{
    unsigned long long int f = 1;

    while ( *x > 1 ) f *= ( *x )--;

    *x = f;
}

如果进入20则程序输出将如上所示。

value of 20! = 2432902008176640000
于 2020-03-14T02:32:11.270 回答
1

Scanf takes a pointer to the variable, to return something from a void function you must call it by reference with a pointer to the return variable and not by its value.

于 2020-03-14T00:26:38.513 回答
1

问题1:

scanf("%d", x);

应该:

scanf("%d", &x);

&非常重要。


问题 2

在函数fact中,您从j以下位置开始0

int j=0;

您的循环仅在 while 运行j>1

for(i=1; j>1; j--){

告诉我:什么0 时候 >1??
你的循环永远不会运行。


问题3:

您期望调用fact(x);将更改 的值x
在 C 中,一个函数不能改变它的一个参数。参数是“按副本”传递的。

如果你想改变调用者中的一个对象(变量),你必须传递一个指向它的指针:

void fact(int* i);

[...]
//function called:
fact(&x);
[...]


//factorial definition:
void fact(int* i){
   int j=0;
   for(*i=1; j>1; j--){
      *i= *i * j;
      return;
   }
}
于 2020-03-14T00:27:49.840 回答