C语言常见运算符

C语言提供了丰富的运算符,这些运算符用于执行各种类型的操作,比如算术运算、比较运算、逻辑运算、位运算等。下面是一些基本的C语言运算符分类及其示例:

1. 算术运算符

  • 加法 (+) : a + b 表示a和b的和。
  • 减法 (-) : a - b 表示a和b的差。
  • 乘法 (*) : a * b 表示a和b的积。
  • 除法 (/) : a / b 表示a除以b的商(注意:结果会向0取整)。
  • 取模 (%) : a % b 表示a除以b的余数。
  • 自增 (++) : ++aa++,将a的值增加1。
  • 自减 (--) : --aa--,将a的值减少1。
cpp 复制代码
#include <stdio.h>  
  
int main() {  
    int a = 5, b = 3;  
    int sum = a + b;    // 加法  
    int difference = a - b; // 减法  
    int product = a * b; // 乘法  
    int quotient = a / b; // 除法  
    int remainder = a % b; // 取模  
  
    printf("和: %d\n", sum);  
    printf("差: %d\n", difference);  
    printf("积: %d\n", product);  
    printf("商: %d\n", quotient);  
    printf("余数: %d\n", remainder);  
  
    return 0;  
}

2. 关系运算符

  • 大于 (>) : a > b 如果a大于b,结果为真(true)。
  • 小于 (<) : a < b 如果a小于b,结果为真(true)。
  • 等于 (==) : a == b 如果a等于b,结果为真(true)。
  • 不等于 (!=) : a != b 如果a不等于b,结果为真(true)。
  • 大于等于 (>=) : a >= b 如果a大于或等于b,结果为真(true)。
  • 小于等于 (<=) : a <= b 如果a小于或等于b,结果为真(true)。
cpp 复制代码
#include <stdio.h>  
  
int main() {  
    int a = 10, b = 20;  
  
    if (a > b) {  
        printf("a大于b\n");  
    } else if (a < b) {  
        printf("a小于b\n");  
    } else {  
        printf("a等于b\n");  
    }  
  
    // 其他关系运算符示例  
    printf("a不等于b: %d\n", a != b); // 输出 1(真)  
    printf("a大于等于b: %d\n", a >= b); // 输出 0(假)  
  
    return 0;  
}

3. 逻辑运算符

  • 逻辑与 (&&) : a && b 如果a和b都为真(true),则结果为真(true)。
  • 逻辑或 (||) : a || b 如果a或b中有一个为真(true),则结果为真(true)。
  • 逻辑非 (!) : !a 如果a为假(false),则结果为真(true);反之亦然。
cpp 复制代码
#include <stdio.h>  
  
int main() {  
    int a = 1, b = 0;  
  
    if (a && b) {  
        printf("a和b都是真\n");  
    } else {  
        printf("a和b中至少有一个是假\n");  
    }  
  
    if (a || b) {  
        printf("a和b中至少有一个是真\n");  
    } else {  
        printf("a和b都是假的\n");  
    }  
  
    printf("a的否定: %d\n", !a); // 注意这里实际上会输出0(因为!a是假),但中文描述需要调整  
    // 更准确的中文描述可能是:"如果a为真,则输出假;如果a为假,则输出真。"  
    // 但由于printf直接输出的是整数值,所以这里还是保持了原始的数字输出。  
  
    return 0;  
}

4. 位运算符

  • 按位与 (&) : a & b 对a和b的每一位执行与操作。
  • 按位或 (|) : a | b 对a和b的每一位执行或操作。
  • 按位异或 (^) : a ^ b 对a和b的每一位执行异或操作。
  • 按位取反 (~) : ~a 对a的每一位执行取反操作。
  • 左移 (<<) : a << b 将a的二进制表示向左移动b位。
  • 右移 (>>) : a >> b 将a的二进制表示向右移动b位。
cpp 复制代码
#include <stdio.h>  
  
int main() {  
    unsigned int a = 5; // 二进制为 0101  
    unsigned int b = 3; // 二进制为 0011  
  
    printf("a & b: %u\n", a & b); // 0101 & 0011 = 0001  
    printf("a | b: %u\n", a | b); // 0101 | 0011 = 0111  
    printf("a ^ b: %u\n", a ^ b); // 0101 ^ 0011 = 0110  
    printf("~a: %u\n", ~a); // ~0101 = 1010...(注意这里会有补码扩展)  
    printf("a << 1: %u\n", a << 1); // 0101 << 1 = 1010  
    printf("a >> 1: %u\n", a >> 1); // 0101 >> 1 = 0010  
  
    return 0;  
}

5. 赋值运算符

  • 赋值 (=) : a = b 将b的值赋给a。
  • 复合赋值运算符 (如 +=, -=, *=, /=, %=): 它们在赋值的同时执行指定的算术运算。
cpp 复制代码
#include <stdio.h>  
  
int main() {  
    int a = 5;  
    int b;  
  
    // 简单的赋值  
    b = a;  
    printf("b = a: b = %d\n", b);  
  
    // 加法赋值  
    a += 3; // 等同于 a = a + 3;  
    printf("a += 3: a = %d\n", a);  
  
    // 乘法赋值  
    a *= 2; // 等同于 a = a * 2;  
    printf("a *= 2: a = %d\n", a);  
  
    // 位运算赋值(以左移为例)  
    a <<= 1; // 等同于 a = a << 1;  
    printf("a <<= 1: a = %d\n", a);  
  
    return 0;  
}

6. 条件运算符

  • 条件 (?:) : a ? b : c 如果a为真(true),则结果为b;否则为c。
cpp 复制代码
#include <stdio.h>  
  
int main() {  
    int a = 10, b = 20;  
    int max = (a > b) ? a : b; // 如果a大于b,则max=a,否则max=b  
    printf("较大的数是: %d\n", max);  
  
    return 0;  
}

7. 逗号运算符

  • 逗号 (,) : a, b 依次计算a和b的值,并返回b的值。
cpp 复制代码
#include <stdio.h>  
  
int main() {  
    int a = (5, 10); // 逗号运算符,a的值为10  
    printf("a的值是: %d\n", a);  
  
    // 逗号运算符在for循环中的应用  
    for (int i = 0, j = 0; i < 5; i++, j += 2) {  
        // 循环体  
    }  
  
    // 注意:上面的for循环只是展示了逗号运算符的用法,并没有实际的打印或输出  
  
    return 0;  
}

8. 指针运算符

  • 取地址 (&) : &a 获取变量a的地址。
  • 间接引用 (*) 或 解引用 : *p 获取指针p所指向地址的值。
cpp 复制代码
#include <stdio.h>  
  
int main() {  
    int var = 20;  
    int *ptr;  
  
    // 取地址运算符  
    ptr = &var;  
    printf("var的地址是: %p\n", (void*)ptr); // 注意使用%p来打印指针,并强制转换为void*以避免警告  
  
    // 解引用运算符  
    printf("var的值是: %d\n", *ptr);  
  
    return 0;  
}

9. 长度运算符

  • sizeof : sizeof(a) 返回a所占用的字节数。
cpp 复制代码
#include <stdio.h>  
  
int main() {  
    int a = 10;  
    printf("int类型的大小是: %zu字节\n", sizeof(int)); // 注意使用%zu来匹配size_t类型  
    printf("变量a的大小是: %zu字节\n", sizeof(a));  
  
    return 0;  
}

10.类型转换运算符

类型转换运算符用于将一种数据类型的值转换为另一种数据类型。

cpp 复制代码
#include <stdio.h>  
  
int main() {  
    float f = 3.14;  
    int i = (int)f; // 将float类型的f转换为int类型  
    printf("f转换为int后的值是: %d\n", i);  
  
    // 或者使用C99引入的复合字面量进行类型转换(虽然这不是运算符,但相关)  
    double d = (double){i}; // 实际上这里的转换是多余的,因为i已经是整数,但展示了类型转换的另一种形式  
    printf("i转换为double后的值是: %f\n", d);  
  
    return 0;  
}

(重点)运算符优先级

另外,也可以括号()来改变优先级

相关推荐
jiao000011 小时前
数据结构——队列
c语言·数据结构·算法
铁匠匠匠1 小时前
从零开始学数据结构系列之第六章《排序简介》
c语言·数据结构·经验分享·笔记·学习·开源·课程设计
C-SDN花园GGbond1 小时前
【探索数据结构与算法】插入排序:原理、实现与分析(图文详解)
c语言·开发语言·数据结构·排序算法
Navigator_Z3 小时前
数据结构C //线性表(链表)ADT结构及相关函数
c语言·数据结构·算法·链表
菜菜想进步4 小时前
内存管理(C++版)
c语言·开发语言·c++
知星小度S4 小时前
C语言——自定义类型
c语言·开发语言
cleveryuoyuo4 小时前
二叉树的链式结构和递归程序的递归流程图
c语言·数据结构·流程图
科研小白_d.s4 小时前
vscode配置c/c++环境
c语言·c++·vscode
暮色_年华5 小时前
嵌入式C语言自我修养:C语言的模块化的编程思想
c语言
大母猴啃编程6 小时前
数据结构---非线性--树
c语言·数据结构·学习·算法·青少年编程