在C语言中,函数的定义和调用通常遵循顺序结构
但在你调用一个函数之前,可以先声明该函数。这样可以在代码的任何地方调用该函数,而不必在调用之前定义它。例如:
#include <stdio.h>
void myFunction(); // 函数声明
int main() {
myFunction(); // 调用函数
return 0;
}
void myFunction() { // 函数定义
printf("Hello, World!\n");
}
在C语言中,可以通过多种方法交换两个变量的值而不使用额外的变量
第一种,使用简单的加减乘除
int a = 5, b = 10;
a = a + b; // a 现在是 15
b = a - b; // b 现在是 5
a = a - b; // a 现在是 10
先令其中一个为sum,在针对另外一个变量(注意,第二步必须是对另一个变量),令其为sum-自身,这样该值就实现了交换
再对其值为sum的变量,令其值为sum-另一变量,由于另一变量已经实现了值的交换,这样得到的结果便是另一变量的原来的值
这里我们进行类比,有下面的方法
a = a * b; // a 现在是 50
b = a / b; // b 现在是 5
a = a / b; // a 现在是 10
其原理与上面的加减法相同,不多赘述
第二种,使用异或运算符
在开始之前,我们先来了解异或运算的性质,这非常重要
异或运算(XOR,符号为 ^
)是一种二进制运算,具有一些重要的数学性质
1. 自反性
对于任何数 xx,都有:
x⊕x=0
这意味着一个数与自身进行异或运算的结果是零
2. 单位元为0
对于任何数 x,都有:
x⊕0=x
这意味着任何数与零进行异或运算的结果是它自身
//单位元(Identity Element)是指在某种运算下,能够与任何元素结合而不改变该元素的特定元素
这其实是一种数学的概念
在不同的运算中,单位元可能是不同的。例如:
- 加法:在加法运算中,单位元是 0,因为对于任何数 x,都有 x+0=x
- 乘法:在乘法运算中,单位元是 1,因为对于任何数 x,都有 x×1=x
- 异或运算:在异或运算中,单位元是 0,因为对于任何数 x,都有 x⊕0=x
3. 交换律
对于任何两个数 x 和 y,都有:
x⊕y=y⊕x
这意味着异或运算的顺序可以交换(这其实是废话)
4. 结合律
对于任何三个数 x、y 和 z,都有:
(x⊕y)⊕z=x⊕(y⊕z)
这意味着可以任意组合异或运算的顺序(和乘除运算一样)
5. 反演性
对于任何数 x,都有:
x⊕x⊕x= (x⊕x)⊕x =0⊕x=x
这意味着异或运算是自反的,应用两次会返回到原始值
//注意,这只是运算,x本身的值没有改变!
说了这么多,其实和利用异或运算交换变量的原理无关
异或运算的原理,按照我的理解,是因为二进制只有0和1两种形式所产生的“巧合”
#include <stdio.h>
int main() {
int a = 5, b = 10;
a = a ^ b; // a 现在是 a 和 b 的异或
b = a ^ b; // b 现在是原来的 a
a = a ^ b; // a 现在是原来的 b
return 0;
}
两个数异或得到的结果,是一个“毫无关系的数”,但是在二进制上,它和这两个数中的任何一个异或,都能得到这两个数中的另外的那个数
a^b^b得到a
a^b^a得到b
就是这么个意思
Comments NOTHING