关于c++参数传递的传值调用的问题

问题描述

关于c++参数传递的传值调用的问题

我看书本上还有网上一些博客都说传值方式不会改变实参的值,但是我在调试下面这段代码时得出的结果是“x:20 y:10",这跟书本说的不一样,能解释一下吗?(我用的是dev cpp 5.6.3)
代码:
int main()
{
int x=10,y=20;
swap(x,y);
cout<<"x:"<<x<<" "<<"y:"<<y;
return 0;
}
void swap(int x,int y)
{
int temp;
temp=x;
x=y;
y=temp;

}

解决方案

http://codepad.org/RG6qPfAY
x:10 y:20
没有问题。

 #include<iostream>
using namespace std;
void swap(int x,int y);
int main()
{
    int x=10,y=20;
    swap(x,y);
    cout<<"x:"<<x<<" "<<"y:"<<y;
    return 0;
}
void swap(int x,int y)
{
    int temp;
    temp=x;
    x=y;
    y=temp;

}

仔细看和你的程序有什么不同?
看到没有,你缺少了函数的声明,C要求先声明后使用。

你肯定要问没有声明,我的代码怎么还能编译?对,因为系统库中也有一个swap函数。你调用的根本不是你写的。
系统的swap当然可以交换了。

解决方案二:

你把swap放到main函数下方,main中用的不是你自己的swap,应该是环境中的swap,你可以去掉你自己的swap试试,应该不会报错。
你在main中声明一下就调用你自己的了

 void swap(int x,int y);
int x=10,y=20;

解决方案三:

因为系统函数也有swap,而你的函数写在了主函数的下面,掩盖了这个问题。所以颠倒下
void swap(int x,int y)
{
int temp;
temp=x;
x=y;
y=temp;

}
int main()
{
int x=10,y=20;
swap(x,y);
cout<<"x:"<<x<<" "<<"y:"<<y;
return 0;
}
就可以了

结论:传值方式不会改变实参的值,这是对的。
希望采纳我的答案哦,捂脸~~

解决方案四:

调用了系统的函数swap,系统里面已经做了优化处理

解决方案五:

你调用了系统的swap函数,传的是引用而非值,因此你传入的x,y发生了改变!
若要不变,得自己写个swap函数即可

时间: 2024-08-03 13:29:41

关于c++参数传递的传值调用的问题的相关文章

wpf-WPF传值调用组件未定义

问题描述 WPF传值调用组件未定义 要实现根据总线数据的0或1使其按钮变可用及不可用.实现如下,但是会报错,专门建一个公共类也是同样的报错.错误为:The component 'CANLib.SystemSettingsDlg' does not have a resource identified by the URI '/CANLib;component/systemsettingsdlg.xaml'. 网上查了还是不知道如何解决,在此请教下,万分感谢. 主工程数据解析处理类UInt16Pa

对Java中传值调用的理解分析_java

本文实例分析了Java中的传值调用.分享给大家供大家参考.具体分析如下: Java以引用的方式操作对象实例 可以确认的是Java中操作对象的方式是以引用的方式操作对象.为了更深刻的了解这点我写了如下代码: 首先定义一个自定义类型 复制代码 代码如下: public class Person {            String name;            Person(String name){          this.name = name;      }  } 这里name默认是

JavaScript函数的调用以及参数传递_基础知识

JavaScript 函数调用 JavaScript 函数有 4 种调用方式. 每种方式的不同方式在于 this 的初始化.this 关键字 一般而言,在Javascript中,this指向函数执行时的当前对象. Note 注意 this 是保留关键字,你不能修改 this 的值.调用 JavaScript 函数 函数中的代码在函数被调用后执行.作为一个函数调用实例 function myFunction(a, b) { return a * b; } myFunction(10, 2); //

C语言的传值与传址调用

传值调用并不能改变两个变量的值,而传址能. 为什么,因为,传值调用,仅仅是在函数内,调换参数的值. 而地址所指向的值,改变的不仅仅是函数内,函数外也改变. 请看代码: 这里还要注意:通常我们不会返回局部变量的地址. 1 #include <stdio.h> 2 3 void swap_value(int x,int y) 4 { 5 int temp; 6 temp = x; 7 x = y; 8 y = temp; 9 printf("传值函数内的输出 %d %d \n"

java-Java中为什么匿名对象中方法,调用局部变量必须加final呢,求详解

问题描述 Java中为什么匿名对象中方法,调用局部变量必须加final呢,求详解 Java中为什么匿名对象中方法,调用局部变量必须加final呢,求详解.在网上找了很久,基本没看到想要的答案,最好从Java虚拟机内存分配角度讲一讲,其他角度亦可. 老师只告诉这么用就好了,问了也说不知道,匿名对象在哪没研究过 求大神回复 解决方案 为什么匿名内部类调用的方法内局部变量必须为final为什么匿名内部类调用的方法内局部变量必须为final为什么匿名内部类调用的方法内局部变量必须为final 解决方案二

php函数传值的引用传递注意事项分析_php技巧

本文实例讲述了php函数传值的引用传递注意事项.分享给大家供大家参考,具体如下: Strict standards: Only variables should be passed by reference 网上查到资料有这么一句话: 在php5.3以上版本会出这个问题,应该也和php的配置有关,只要把这一句拆成两句就没有问题了.因为array_walk的参数是引用传递的,5.3以上默认只能传递具体的变量,而不能通过函数返回值.当然你也可以修改php.ini 里的 error_reporting

c# 3.0-C#调用C++ dll出现的问题

问题描述 C#调用C++ dll出现的问题 C#调用C++的dll库时,其中库中对应的函数中带有指针,用的unsafe,但是会出现错误 错误 CS0122: "WindowsFormsApplication1.THFeature.EF_Compare(ref byte, ref byte)"不可访问,因为它受保护级别限制 解决方案 THFeature.EF_Compare 这个方法要定义成public的. 解决方案二: 方法**EF_Compare **访问修饰符是什么?如果受保护级的

PHP传参之传值与传址的区别_php技巧

废话不多说,先来看段代码 function test(&val){ return $val; } 其中为什么用到&进行传参呢,有什么好处? 传址是允许在函数内部进行改变的意思,比如: $test = "hello"; function myFun(&$val){ $val = "hello world"; return $val; } echo myFun(&$test); //hello world echo $test; //he

Java方法参数是引用调用还是值调用?_java

方法调用(call by) 是一个标准的计算机科学术语.方法调用根据参数传递的情况又分为值调用( call by reference ) 和引用调用( call by value ) .江湖上有很多关于这两种调用的定义 ,最通常的说法是传递值的是值调用,传递地址的是引用调用.这其实很不恰当,这种 这些说法很容易让我们联想到Java的对象参数传递是引用调用,实际上,Java的对象参数传递仍然是值调用 . 我们首先用一段代码来证实一下为什么Java的对象参数传递是值调用. public class