1.怎么不用中间变量直接实现 数值交换?
假设a b 不等
a = a^b
b = b^a
a = a^b
首先肯定异或是满足交换律的。
由于a=a^b,这里的a有两层意思,所以我用c来表示a^b的值。而出现的a,都表示没有发生改变前的。
a = a^b // 这个相当于a=c。这在我的约定下没什么意义,只是表示a舍弃了a的值。而用于存c的值。
b = b^a // 这在我的约定下,相当于b=b^c,将c展开,有b=b^a^b=b^b^a(这交换律)用x^x=0的公式,立刻有b=0^a,再由公式二,有b=a。至此,b舍弃了b的值,用于存a的值了。
a = a^b // 这在我的约定下,相当于a=c^a(因为此时的b存的是a的值),将c展开,有a=a^b^a,应用一下那两个公式,不难得到a=b的结论。就是说,a现在舍弃了c的值,而存了b的值。即完成了a, b交换的任务。
一。全局变量和局部变量
1。局部变量
他是 指在函数内部定义的变量 作用域为定义局部变量的函数 也就是说他只能在定义他的函数中使用
最值得注意的是 只有在程序执行到定义他的模块时才能生成,一旦执行退出该模块则起变量消失
eg.
func ()
{
int x; 局部变量x的作用域 很明确
......
}
2。全局变量
在程序执行的过程中一直有效
eg.
int x=1;
func ()
{
x=x+1;
}
func1 ()
{
x=x-1;
}
main ()
{
}
由此不难看出整型x的作用范围
对于全局变量 如果在定义的时候不做初始化 则系统将自动为起赋值 数值型为0
字符型为空'\0'
全局变量的弊端 增加内存开销 降低函数的通用性
定义全局变量时 理想的位置是在文件的开头 当这些函数以及同一个程序中的其他源程序文件中的某些函数需要使用该全局变量时 在函数内部对该变量使用extern 加以说明 说明他是外部的
(这里还要做详细的讲解)
eg.
main ()
{
extern int a,b;
printf ("mIn is %d\n",min(a,b));
}
int a=1,b=2;
int min (x,y)
int x,y;
{
int z;
z=x<y?x:y;
return(z);
}
我还要说明的是 对外部变量的说明和对全局变量的定义不是一回事
对外部变量的说明 只是声明该变量是在外部定义过的一个全局变量 在这里引用 而对全局变量的定义则是要对起分配存储单元的
一个全局变量只能定义一次 可是却可以多次引用
*** 在同一源文件中,全局变量和局部变量同名时,在局部变量的作用域内,全局变量不起作用的。
全局变量和局部变量的区别方法就是他们的作用域不同。在同一作用域中如果两个变量的名字相同,遵循低作用域覆盖高作用域的原则。例如:
int a;
class c
{
private:
int a;
public:
void b();
}
c::b()
{
int a;
a=15; //这里的a就是b()中声明的a;
c::a=15; //这里的a是class c声明的a;
::a=15; //这里的a是全局变量a;
}