C语言特殊操作符

文章目录

  • 前言
  • 一、操作符
    • [1. **条件(三元)操作符** `? :`:](#1. 条件(三元)操作符 ? ::)
    • [2. **逗号操作符** `,`:](#2. 逗号操作符 ,:)
    • [3. **位域(bit-field)**:](#3. 位域(bit-field):)
    • [4. **取地址与间接访问操作符** `&` 和 `*`:](#4. 取地址与间接访问操作符 &*:)
    • [5. **强制类型转换(Cast)** `(type)`:](#5. 强制类型转换(Cast) (type):)
    • [6. **sizeof操作符** `sizeof`:](#6. sizeof操作符 sizeof:)
    • [7. **_Alignof操作符** `_Alignof`(C11引入):](#7. _Alignof操作符 _Alignof(C11引入):)
    • [8. **复合文字(compound literals)** `(type){initializers}`:](#8. 复合文字(compound literals) (type){initializers}:)
    • [9. **指定初始化器(designated initializers)** `.member = value`(C99引入):](#9. 指定初始化器(designated initializers) .member = value(C99引入):)
    • [10. **预处理器操作符** `#` 和 `##`:](###`:)
  • 总结

前言

C语言中有一些操作符,它们可能被认为是"特殊"的,因为它们的用法和功能不同于其他常见操作符。


一、操作符

1. 条件(三元)操作符 ? :

  • 这个操作符提供了一种简洁的方式来实现if-else逻辑。
  • 语法:condition ? value_if_true : value_if_false
  • 问号前面是表达式,表达式的值(为真)不为零返回value_if_true,反之返回value_if_false

2. 逗号操作符 ,

  • 用来在表达式中顺序地求值多个表达式,并返回最后一个表达式的值。
  • 例如:(x = 5, y = 6, x + y) 将会先计算 x = 5, 然后 y = 6, 最后计算并返回 x + y 的值。

3. 位域(bit-field)

  • 虽然不是传统意义上的操作符,但这是一个特殊的结构成员声明方式,它允许定义一个特定长度(以比特为单位)的整数类型变量。
  • 例如:struct { unsigned int a:1; unsigned int b:3; } bitfield;
  • 本来int是4位,a变量这样做了之后就只占一位,但相应的存储能力也会减小,需要主要溢出问题

4. 取地址与间接访问操作符 &*

  • & 操作符用于获取变量的地址。
  • * 操作符用于解引用指针,即访问指针所指向的内存位置的值。

5. 强制类型转换(Cast) (type)

  • 用来将一个数据类型的值转换为另一个数据类型的值。
  • 例如:(int)3.14 将浮点数 3.14 强制转换为整数 3

6. sizeof操作符 sizeof

  • 返回给定类型或对象所占用的字节数。
  • 例如:sizeof(int) 返回一个整型变量所占的字节数。

7. _Alignof操作符 _Alignof(C11引入):

  • 返回指定类型所需的对齐要求。
  • 例如:_Alignof(double) 返回双精度浮点数类型的对齐值。

8. 复合文字(compound literals) (type){initializers}

  • 允许创建匿名的对象,可以是数组、结构体或联合体。
  • 例如:(int[]){1, 2, 3} 创建了一个包含三个整数的匿名数组。

9. 指定初始化器(designated initializers) .member = value(C99引入):

  • 允许你直接初始化结构体或联合体的成员,而不需要按照声明的顺序。
  • 例如:struct point { int x, y; }; struct point p = {.y = 10, .x = 5};

10. 预处理器操作符 ###

复制代码
- `#` 在宏定义中使用时,可以把参数转换成字符串(字符串化)。
- `##` 用于连接两个标记(token concatenation),通常用于宏定义中。
c 复制代码
#define PASTE(a, b) a ## b
int value = PASTE(num, _count); // 相当于 int value = num_count;

总结

这些特殊操作符和特性使得C语言更加灵活和强大,但也增加了学习曲线和复杂性。正确理解和使用这些特性可以帮助编写更高效、紧凑和可读的代码。

相关推荐
让我们一起加油好吗4 小时前
【数论】欧拉定理 && 扩展欧拉定理
c++·算法·数论·1024程序员节·欧拉定理·欧拉降幂·扩展欧拉定理
Yupureki5 小时前
从零开始的C++学习生活 14:map/set的使用和封装
c语言·数据结构·c++·学习·visual studio·1024程序员节
一匹电信狗5 小时前
【LeetCode_876_2.02】快慢指针在链表中的简单应用
c语言·数据结构·c++·算法·leetcode·链表·stl
胖咕噜的稞达鸭5 小时前
算法入门---专题二:滑动窗口2(最大连续1的个数,无重复字符的最长子串 )
c语言·数据结构·c++·算法·推荐算法·1024程序员节
兮山与5 小时前
算法18.0
算法
Yupureki5 小时前
从零开始的C++学习生活 15:哈希表的使用和封装unordered_map/set
c语言·数据结构·c++·学习·visual studio·1024程序员节
码农多耕地呗5 小时前
力扣543.二叉树的直径(java)(迭代法 and 左右根后序遍历迭代法)
算法·leetcode·职场和发展
yongui478346 小时前
B树和B+树的解析应用
数据结构·b树·前端框架
努力学习的小廉6 小时前
我爱学算法之—— 分治-归并
c++·算法·1024程序员节
Gorgous—l6 小时前
数据结构算法学习:LeetCode热题100-链表篇(下)(随机链表的复制、排序链表、合并 K 个升序链表、LRU 缓存)
数据结构·学习·算法