关于#c++#的问题:是因为没有return嘛

img


为啥保持原值不变?是因为没有return嘛?搜索的答案说因为值交换 不能传递 但还是不理解为什么😢他什么情况下才会输出交换什么情况不交换呢?

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/231298
  • 这篇博客也不错, 你可以看下C++语言的return语句的一点说明
  • 除此之外, 这篇博客: 【C++基础】第6章:函数中的 2.2.2.2 显式返回关键字: return 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    1. return; 语句
      在这里插入图片描述
      fun函数在执行到第6行就触发返回了。
    2. return 表达式 ;
      错:在这里插入图片描述
      没有了void,我们需要返回具体的int类型的东西(或者返回的是可以转换为int类型的东西)。

    应为:
    在这里插入图片描述
    我们会使用这个100来初始化12行中的x值(相当于初始化了一个对象x)。

    复杂点的:
    在这里插入图片描述

    1. return 初始化列表 ;

    第7行的{1, 2, 3, 4, 5}就是初始化列表。我们可以使用初始化列表来初始化vector(std::vector<int>),然后在13行调用时,调用完之后,fun函数返回一个std::vector<int>,相应地,我们使用std::vector<int>初始化变量x,x的类型就是std::vector<int>,其中包含12345这5个数字。
    在这里插入图片描述
    在这里插入图片描述
    但注意,如果使用initializer_list。我们使用{1, 2, 3, 4, 5}初始化initializer_list,会有很多warning:
    在这里插入图片描述
    initializer_list里面包含两个指针,一个指针指向{1, 2, 3, 4, 5}中头元素,一个指向{1, 2, 3, 4, 5}的最后一个元素的下一位。如果在13行,把initializer_list返回之后,则x是initializer_list这样的类型的对象,这个对象里面包含两个指针。但有个问题,{1, 2, 3, 4, 5}是个自动对象(我们会在fun函数结束之后,这个自动对象就被销毁了),如果这个自动对象被销毁了,那么x指向initializer_list(initializer_list里面包含两个指针),但这两个指针指向了一个被销毁的对象第一个元素和最后一个元素的下一位。接下来,如果我们使用x做一系列操作时,这些操作是没有意义的。

因为函数f()中的形参x和y只是拷贝了实参的值,它们的地址是不同的,所以函数f()中的交换,只改变了函数的形参,不会改变main方法里传入变量的值。

测试代码如下:

参考链接:


#include <stdio.h>
// https://blog.csdn.net/m0_53804791/article/details/116049548
void f(int x, int y){
    
    int t;
    printf("in f(), before change , &x=%p, &y=%p, x=%d, y=%d\n",&x,&y,x,y);
    
    if(x<y){
        t=x;
        x=y;
        y=t;
    }
    
    printf("in f(), after change , &x=%p, &y=%p, x=%d, y=%d\n\n",&x,&y,x,y);
}


int main(void){
    
    int a=4,b=3,c=5;
    printf("in main(), before , &a=%p, &b=%p, &c=%p, a=%d, b=%d, c=%d\n\n",&a,&b,&c,a,b,c);

    
    f(a,b);
    f(a,c);
    f(b,c);
    
    printf("in main(), before, &a=%p, &b=%p, &c=%p, a=%d, b=%d, c=%d\n\n",&a,&b,&c,a,b,c);
    printf("%d,%d,%d\n",a,b,c);
    
    return 0;
    
    
} 



img

和 return 没关系,
f函数要想交换,正确的写法是
void f(int *x, int * y)
{
int t;
if (*x < *y) { t = *y; *y = *x; *x = t; }
}
main里面
f(&a, &b); f(&a, &c); f(&b, &c);