C语言复习概要(四)

2024-10-08 08:02:10 浏览数 (2)

1. 操作符的分类

C语言中的操作符种类繁多,常用的主要操作符可以按照其功能进行如下分类:

  • 算术操作符:用于基本的数学运算,例如加法、减法、乘法和除法。
  • 关系操作符:用于比较两个操作数的关系,返回布尔值(真或假)。
  • 逻辑操作符:用于逻辑运算,如与、或、非等,用于条件判断。
  • 位操作符:按位操作符处理位级别的数据操作。
  • 赋值操作符:将右侧的值赋给左侧变量。
  • 条件操作符(三元运算符):对条件表达式进行判断,并根据条件返回不同的值。
  • 逗号操作符:顺序执行多个表达式,并返回最后一个表达式的值。
  • 其他操作符:包括取地址符号&、指针解引用符*等。
算术操作符

算术操作符用于处理整数和浮点数的基本运算,它们包括加法( )、减法(-)、乘法(*)、除法(/)和取模(%)。

代码示例:更复杂的算术操作

代码语言:javascript复制
#include <stdio.h>

int main() {
    int a = 15, b = 4;
    float x = 7.5, y = 2.0;

    // 整数算术操作
    printf("a   b = %dn", a   b); // 加法
    printf("a - b = %dn", a - b); // 减法
    printf("a * b = %dn", a * b); // 乘法
    printf("a / b = %dn", a / b); // 整数除法
    printf("a %% b = %dn", a % b); // 取模操作

    // 浮点数算术操作
    printf("x   y = %.2fn", x   y); // 浮点加法
    printf("x - y = %.2fn", x - y); // 浮点减法
    printf("x * y = %.2fn", x * y); // 浮点乘法
    printf("x / y = %.2fn", x / y); // 浮点除法

    // 混合算术操作
    printf("a   x = %.2fn", a   x); // 整数与浮点混合运算
    printf("b * y = %.2fn", b * y);

    return 0;
}

在这个例子中,我们展示了整数与浮点数的加法、减法、乘法、除法和取模运算。整数运算和浮点数运算的区别是,整数除法会丢弃小数部分,而浮点运算会保留小数部分。

关系操作符

关系操作符用于比较两个值,并返回一个布尔结果。它们包括:

  • ==:等于。
  • !=:不等于。
  • <:小于。
  • >:大于。
  • <=:小于等于。
  • >=:大于等于。

代码示例:使用关系操作符进行比较

代码语言:javascript复制
#include <stdio.h>

int main() {
    int a = 10, b = 20;

    // 比较 a 和 b
    if (a == b) {
        printf("a 等于 bn");
    } else {
        printf("a 不等于 bn");
    }

    if (a < b) {
        printf("a 小于 bn");
    } else {
        printf("a 不小于 bn");
    }

    if (a >= 5) {
        printf("a 大于等于 5n");
    }

    return 0;
}

通过使用关系操作符,可以轻松判断两个操作数之间的大小关系,从而在程序中做出条件判断。关系操作符的返回结果通常用于if语句或其他控制结构中。

逻辑操作符

逻辑操作符用于布尔逻辑运算,包括:

  • &&:逻辑与。如果两个操作数都为真,则结果为真。
  • ||:逻辑或。如果至少一个操作数为真,则结果为真。
  • !:逻辑非。将真值转换为假,将假值转换为真。

代码示例:逻辑操作符在条件判断中的使用

代码语言:javascript复制
#include <stdio.h>

int main() {
    int a = 5, b = 10, c = 15;

    // 使用逻辑与操作符
    if (a < b && b < c) {
        printf("a 小于 b 且 b 小于 cn");
    }

    // 使用逻辑或操作符
    if (a > b || b < c) {
        printf("a 大于 b 或者 b 小于 cn");
    }

    // 使用逻辑非操作符
    if (!(a == b)) {
        printf("a 不等于 bn");
    }

    return 0;
}

在这个示例中,逻辑与(&&)和逻辑或(||)用于复杂条件判断。逻辑非(!)通常用于反转条件的布尔值,便于简化条件表达式。


2. 二进制制和进制转换

二进制(binary)、八进制(octal)和十六进制(hexadecimal)在低层次的系统编程中非常常见。C语言提供了便捷的方法来表示不同进制的数值。理解二进制数对于掌握位操作符至关重要,而进制转换则是在二进制、十进制和十六进制之间切换。

二进制与十六进制的表示

在C语言中,二进制数通常以0b开头表示,而十六进制数则以0x开头表示。例如,0b1010代表二进制的数字10,而0xA表示十六进制的数字10

代码示例:二进制、八进制和十六进制表示法

代码语言:javascript复制
#include <stdio.h>

int main() {
    int binaryNum = 0b1010;  // 二进制 1010, 等于十进制 10
    int octalNum = 012;      // 八进制 12, 等于十进制 10
    int hexNum = 0xA;        // 十六进制 A, 等于十进制 10

    printf("二进制数 0b1010 = %dn", binaryNum);
    printf("八进制数 012 = %dn", octalNum);
    printf("十六进制数 0xA = %dn", hexNum);

    return 0;
}

在上述代码中,我们使用了不同的进制表示方法,展示了如何在C语言中处理各种进制表示。printf函数中的%d会将数值转换为十进制输出。

进制转换算法

在实际开发中,我们经常需要将一个进制数转换为另一个进制数。下面我们展示如何手动实现二进制到十进制的转换。

代码示例:手动实现进制转换

代码语言:javascript复制
#include <stdio.h>
#include <math.h>

// 二进制转换为十进制
int binaryToDecimal(int binary) {
    int decimal = 0, i = 0, remainder;

    while (binary != 0) {
        remainder = binary % 10;
        binary /= 10;
        decimal  = remainder * pow(2, i);
          i;
    }

    return decimal;
}

// 十进制转换为二进制
int decimalToBinary(int decimal) {
    int binary = 0, i = 1, remainder;

    while (decimal != 0) {
        remainder = decimal % 2;
        decimal /= 2;
        binary  = remainder * i;
        i *= 10;
    }

    return binary;
}

int main() {
    int binary = 1010;
    int decimal = 10;

    printf("二进制 %d 转换为十进制: %dn", binary, binaryToDecimal(binary));
    printf("十进制 %d 转换为二进制: %dn", decimal, decimalToBinary(decimal));

    return 0;
}

这个例子展示了如何手动将二进制转换为十进制,反之亦然。通过简单的算法,可以帮助理解进制转换的过程


3. 原码、反码和补码

原码反码补码是用于表示负数的不同方法,它们在底层编程中极其重要,特别是在涉及位操作时。C语言使用补码来表示负数,这是因为它可以简化硬件加减法操作。

原码

原码是最简单的表示方法,使用符号位来区分正负号。最高位为0表示正数,为1表示负数。例如:

  • 5的原码是:00000101
  • -5的原码是:10000101
反码

反码是对原码的符号位保持不变,其余位按位取反。正数的反码与原码相同,而负数的反码则是在正数基础上按位取反。例如:

  • 5的反码是:00000101
  • -5的反码是:11111010
补码

补码是计算机中最常用的表示负数的方法。负数的补码是反码加1。这样可以简化硬件中的加减法操作。例如:

  • 5的补码是:00000101
  • -5的补码是:11111011

代码示例:理解补码的表示

代码语言:javascript复制
#include <stdio.h>

int main() {
    signed char a = 5;   // 原码: 00000101
    signed char b = -5;  // 补码: 11111011

    printf("5 的二进制补码: %dn", a);
    printf("-5 的二进制补码: %dn", b);

    return 0;
}

在上面的例子中,计算机内部存储负数的方式是通过补码完成的,理解补码对于进行位操作和低级编程非常重要。

0 人点赞