【问题标题】:Why is it printing 52 instead of 254 [closed]为什么打印 52 而不是 254 [关闭]
【发布时间】:2023-01-14 09:28:03
【问题描述】:
#include <stdio.h>

int fun(int x,int y);

int main()
{
    int i = 5, j = 2;
    fun(i, j);
    printf("%d%d", i, j);
    return 0;
}

int fun(int x, int y)
{
    x = x * x;
    y = y * y;
    return (x);
    return (y);
}

【问题讨论】:

  • 你觉得为什么应该打印 254?
  • 1) 你不能从一个函数返回多个值 2) C 是 pass-by-价值, 意义副本调用新函数时会生成参数,因此fun 中对xy 的任何更改都不会在main 中看到。
  • 我很惊讶你能同时获得这两种回报。
  • @matt 你可以很容易地拥有大量无法访问的代码。
  • 具有活动警告的编译器可能会对具有忽略该返回值的返回值的函数的调用 fun(i,j); 发表评论。使用警告,它们可能会让您意识到调用没有效果,这在 main 中是可见的。这确实回答了你的问题。

标签: c


【解决方案1】:

您将52分配给ij,然后您再也不会修改它们。你确实修改了xy,但那不是ij。所以打印ij打印52

如果你要将指向ij的指针传递给funfun可以修改ij

#include <stdio.h>

void fun( int *x, int *y )
{
    *x = *x * *x;
    *y = *y * *y;
} 

int main( void )
{
   int i = 5;
   int j = 2;

   fun( &i, &j );

   printf( "%d %d
", i, j );
   return 0;
}

提示:始终启用编译器的警告!你犯了一个错误,这会被抓住。对于gcc,我使用-Wall -Wextra -pedantic

【讨论】:

  • 或者返回自定义结构:struct pair { int x, y; } struct pair fun(int x, int y) { struct pair p = { .x = x*x, .y = y*y }; return p; }
  • @Buzz 另一种选择是将指针传递给struct 并让函数对其进行编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 1970-01-01
  • 2016-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-29
相关资源
最近更新 更多