11.11 C语言定义函数可以不遵循顺序结构吗、交换变量的值,但不定义新变量的几个方法

发布于 10 天前  22 次阅读


在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)是指在某种运算下,能够与任何元素结合而不改变该元素的特定元素

这其实是一种数学的概念

在不同的运算中,单位元可能是不同的。例如:

  1. 加法:在加法运算中,单位元是 0,因为对于任何数 x,都有 x+0=x
  2. 乘法:在乘法运算中,单位元是 1,因为对于任何数 x,都有 x×1=x
  3. 异或运算:在异或运算中,单位元是 0,因为对于任何数 x,都有 x⊕0=x

3. 交换律

对于任何两个数 x 和 y,都有:

x⊕y=y⊕x

这意味着异或运算的顺序可以交换(这其实是废话)

4. 结合律

对于任何三个数 x、y 和 z,都有:

(x⊕y)⊕z=x⊕(y⊕z)

这意味着可以任意组合异或运算的顺序(和乘除运算一样)

5. 反演性

对于任何数 x,都有:

xxx= (xx)⊕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

就是这么个意思

届ける言葉を今は育ててる
最后更新于 2024-11-11