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语言更加灵活和强大,但也增加了学习曲线和复杂性。正确理解和使用这些特性可以帮助编写更高效、紧凑和可读的代码。

相关推荐
董董灿是个攻城狮9 小时前
AI视觉连载8:传统 CV 之边缘检测
算法
RuoZoe14 小时前
重塑WPF辉煌?基于DirectX 12的现代.NET UI框架Jalium
c语言
AI软著研究员16 小时前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish16 小时前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱17 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者1 天前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮1 天前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者1 天前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考1 天前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx2 天前
CART决策树基本原理
算法·机器学习