C语言特殊操作符

devtools/2025/1/18 15:47:03/

文章目录

  • 前言
  • 一、操作符
    • 1. **条件(三元)操作符** `? :`:
    • 2. **逗号操作符** `,`:
    • 3. **位域(bit-field)**:
    • 4. **取地址与间接访问操作符** `&` 和 `*`:
    • 5. **强制类型转换(Cast)** `(type)`:
    • 6. **sizeof操作符** `sizeof`:
    • 7. **_Alignof操作符** `_Alignof`(C11引入):
    • 8. **复合文字(compound literals)** `(type){initializers}`:
    • 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),通常用于宏定义中。
#define PASTE(a, b) a ## b
int value = PASTE(num, _count); // 相当于 int value = num_count;

总结

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


http://www.ppmy.cn/devtools/151595.html

相关文章

Linux的常用命令(一)

目录 一、文件处理命令 1.文件处理命令ls 2.文件处理命令cd 3.文件处理命令pwd 4.文件处理命令touch 5.文件处理命令mkdir 6.文件处理命令cp 7.文件处理命令mv 8.文件处理命令rm 9.文件处理命令cat 10.文件处理命令more 11.文件处理命令head 12.文件处理命令tail …

【STM32-学习笔记-10-】BKP备份寄存器+时间戳

文章目录 BKP备份寄存器Ⅰ、BKP简介1. BKP的基本功能2. BKP的存储容量3. BKP的访问和操作4. BKP的应用场景5. BKP的控制寄存器 Ⅱ、BKP基本结构Ⅲ、BKP函数Ⅳ、BKP使用示例 时间戳一、Unix时间戳二、时间戳的转换(time.h函数介绍)Ⅰ、time()Ⅱ、mktime()…

重新审视端到端传输协议:从观念到原则

将一个功能置于一个复杂系统的何处是系统设计中处处遇到的问题。 现在我们都知道传输协议的端到端原则,但在它成为原则之前只是一个观点,曾经有场辩论,有人认为传输协议应该由参与通信的每一跳协同实现,可为什么与此相对的端到端…

Android adb 调试,不在手机上点击信任 “允许usb调试” 即可连接的方式(手机需root)

前言 不知道大家有没有被这玩意儿困扰过,第一次插上手机进行 adb 调试的时候,总会弹出 “允许usb调试” 的弹窗。 这手机明明就在我的手上,为什么还要弹出这个信任框呢,这不是多此一举吗? 一个场景:我现在…

【Linux】【Vim】vim编辑器的用法

一、vim简介 Vim是一款功能强大且高度可定制的文本编辑器,广泛应用于Linux 和 Unix系统中。 它不仅继承了vi编辑器的所有特性,还增加了许多新的功能,如语法高亮、代码折叠、多级撤销等。 Vim有三种主要的工作模式: 命令模式&am…

vue中 子组件在父组件中因为异步问题导致的的underfind报错问题

问题描述 在首页中展示介个相同样式的卡片组件 其中子组件数据为父组件发送数据请求后获取 使用props进行传值处理 这时候我发现控制台出现了underfind报错 原因 当父组件通过 props 向子组件传递数据时,如果数据在父组件中是异步获取的(例如通过 AP…

Haskell语言的网络编程

Haskell语言的网络编程 引言 随着互联网技术的迅猛发展,网络编程已经成为计算机科学和软件开发领域的重要组成部分。网络编程可以让我们构建各种各样的应用程序,从简单的网页到复杂的分布式系统。而在众多编程语言中,Haskell以其独特的函数…

人工智能领域单词:英文解释

目录 1、前言2、单词组1:15个3、单词组2:15个4、单词组3:15个5、单词组4:15个6、单词组5:15个 1、前言 亲爱的家人们,创作很不容易,若对您有帮助的话,请点赞收藏加关注哦&#xff0…