当前位置: 首页 > news >正文

c89、c99、c11

C99 标准开始引入了 // 单行注释。在此之前,C语言只支持 /* ... */ 多行注释。

具体说明:

  • // 单行注释:在C99标准(ISO/IEC 9899:1999)引入之前,C语言中没有单行注释。C99标准借鉴了C++的注释风格,引入了这种单行注释。
  • /* ... */ 多行注释:自C语言的早期版本(包括C89和ANSI C)以来就已经存在。

示例:

在C99之前(例如,使用ANSI C标准的编译器):

int main() {/* 这是一个多行注释 */int a = 10;/* 这是一个多行注释 */return 0;
}

在C99及之后:

int main() {// 这是一个单行注释int a = 10;// 这是另一个单行注释return 0;
}

在现代C编译器中(C99及之后),可以混合使用这两种注释:

int main() {// 这是一个单行注释int a = 10; /* 这是一个多行注释 */return 0;
}

总结:

  • // 单行注释是从C99标准开始引入的。
  • /* ... */ 多行注释从C语言的早期版本(包括C89和ANSI C)就已经存在。

C89(也称为ANSI C)和C99是两个主要的C语言标准,它们之间有许多显著的区别。以下是一些关键区别及相应的示例:

1. 单行注释

  • C89:不支持 // 单行注释。
  • C99:支持 // 单行注释。

示例

// 这是一个C99支持的单行注释
int a = 10; // 这是一个单行注释

2. 变量声明

  • C89:变量必须在函数块的开头声明。
  • C99:变量可以在代码块中的任意位置声明。

示例

// C89
void example() {int a = 10;/* 必须在这里声明所有变量 */int b = 20;a = a + b;
}// C99
void example() {int a = 10;a = a + 10;int b = 20; // 可以在任意位置声明变量a = a + b;
}

3. 复合字面量

  • C89:不支持复合字面量。
  • C99:支持复合字面量。

示例

// C99
struct Point {int x, y;
};
struct Point p = (struct Point){.x = 1, .y = 2}; // 复合字面量

4. 变长数组

  • C89:不支持变长数组。
  • C99:支持变长数组。

示例

// C99
void example(int n) {int arr[n]; // 变长数组for (int i = 0; i < n; i++) {arr[i] = i;}
}

5. 内联函数

  • C89:不支持 inline 关键字。
  • C99:支持 inline 关键字。

示例

// C99
inline int add(int a, int b) {return a + b;
}

6. 数据类型扩展

  • C89:没有 long long 数据类型。
  • C99:引入了 long long 数据类型(至少64位)。

示例

// C99
long long bigNumber = 123456789012345LL;

7. __func__ 预定义标识符

  • C89:没有 __func__ 预定义标识符。
  • C99:引入了 __func__ 预定义标识符,用于获取当前函数的名称。

示例

// C99
#include <stdio.h>void example() {printf("Function name: %s\n", __func__);
}

8. 初始化增强

  • C89:初始化结构体和数组时必须按顺序进行。
  • C99:允许使用指定初始化器(designated initializers)。

示例

// C99
struct Point {int x, y;
};
struct Point p = {.y = 2, .x = 1}; // 指定初始化器

这些示例展示了C99对C89的多方面增强,使C语言变得更为灵活和功能强大。


C11 是 C 语言的一个标准,全称为 ISO/IEC 9899:2011,相对于 C99 进一步引入了一些新特性和改进。以下是 C11 相对于 C99 和 C89 的一些主要区别及相应的示例:

1. _Generic 选择表达式

  • C89/C99:不支持 _Generic 选择表达式。
  • C11:引入了 _Generic 选择表达式,用于泛型编程。

示例

// C11
#include <stdio.h>#define type_of(x) _Generic((x), \int: "int", \float: "float", \double: "double", \default: "other")int main() {int i = 0;float f = 0.0;printf("i is %s\n", type_of(i)); // 输出:i is intprintf("f is %s\n", type_of(f)); // 输出:f is floatreturn 0;
}

2. 匿名结构体和联合体

  • C89/C99:不支持匿名结构体和联合体。
  • C11:支持匿名结构体和联合体。

示例

// C11
struct {union {int i;float f;};
} u;int main() {u.i = 10;printf("%d\n", u.i); // 输出:10u.f = 5.5;printf("%f\n", u.f); // 输出:5.500000return 0;
}

3. 静态断言

  • C89/C99:不支持静态断言。
  • C11:引入了 _Static_assert 关键字,用于在编译时进行静态断言。

示例

// C11
#include <assert.h>_Static_assert(sizeof(int) == 4, "int size is not 4 bytes");int main() {return 0;
}

4. 线程支持

  • C89/C99:不提供标准化的线程支持。
  • C11:引入了 threads.h,提供对多线程的标准支持。

示例

// C11
#include <stdio.h>
#include <threads.h>int thread_func(void *arg) {printf("Hello from thread!\n");return 0;
}int main() {thrd_t t;thrd_create(&t, thread_func, NULL);thrd_join(t, NULL);return 0;
}

5. 对齐支持

  • C89/C99:不提供对齐支持。
  • C11:引入了 _Alignof_Alignas 关键字,用于指定和查询类型对齐要求。

示例

// C11
#include <stdio.h>
#include <stdalign.h>struct S {char c;_Alignas(16) int i;
};int main() {printf("Alignment of char: %zu\n", alignof(char)); // 输出:1printf("Alignment of int: %zu\n", alignof(int)); // 输出:4printf("Alignment of struct S: %zu\n", alignof(struct S)); // 输出:16return 0;
}

6. 预定义宏

  • C89/C99:不支持新的预定义宏。
  • C11:引入了新的预定义宏,例如 __STDC_VERSION__

示例

// C11
#include <stdio.h>int main() {#if __STDC_VERSION__ >= 201112Lprintf("C11 or later\n");#elseprintf("Before C11\n");#endifreturn 0;
}

7. 可选特性宏

  • C89/C99:不支持可选特性宏。
  • C11:引入了可选特性宏,例如 __STDC_NO_THREADS__

示例

// C11
#include <stdio.h>int main() {#ifdef __STDC_NO_THREADS__printf("Threads are not supported\n");#elseprintf("Threads are supported\n");#endifreturn 0;
}

8. 更严格的类型检查

  • C89/C99:类型检查不如 C11 严格。
  • C11:引入了更严格的类型检查和标准库改进。

C11 标准通过引入这些新特性和改进,使得 C 语言变得更加现代化、灵活和安全,特别是在泛型编程、静态断言、多线程和内存对齐等方面提供了显著的增强。

相关文章:

c89、c99、c11

C99 标准开始引入了 // 单行注释。在此之前&#xff0c;C语言只支持 /* ... */ 多行注释。 具体说明&#xff1a; // 单行注释&#xff1a;在C99标准&#xff08;ISO/IEC 9899:1999&#xff09;引入之前&#xff0c;C语言中没有单行注释。C99标准借鉴了C的注释风格&#xff0…...

【网络安全的神秘世界】已解决burpsuite报错Failed to start proxy service on 127.0.0.1:8080

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 解决burpsuite无法在 127.0.0.1&#xff1a;8080 上启动代理服务端口被占用以及抓不到本地包的问题 Burpsuite无法启动proxy…...

【C#】使用数字和时间方法ToString()格式化输出字符串显示

在C#编程项目开发中&#xff0c;几乎所有对象都有格式化字符串方法&#xff0c;其中常见的是数字和时间的格式化输出多少不一样&#xff0c;按实际需要而定吧&#xff0c;现记录如下&#xff0c;以后会用得上。 文章目录 数字格式化时间格式化 数字格式化 例如&#xff0c;保留…...

Mac系统主机名变为bogon的解决方案

如题 在使用Mac操作系统时&#xff0c;您可能会遇到一个有趣且略显困扰的问题&#xff1a;终端中显示的主机名突然变成了“bogon”。这不仅让人困惑&#xff0c;还可能给日常操作带来不便。本文旨在提供一种简便的解决方法&#xff0c;帮助您将主机名恢复为正常状态。 什么是…...

行列式和矩阵的区别

目录 一、行列式 1. 行列式的定义 2. (全)排列 3. 逆序数 二、矩阵 1. 矩阵的定义 三、行列式和矩阵的区别 四、参考书目 一、行列式 1. 行列式的定义 2. (全)排列 3. 逆序数 二、矩阵 1. 矩阵的定义 三、行列式和矩阵的区别 四、参考书目 同济大学数学系. 工程数学…...

MATLAB复习

MATLAB常用的标点符号 空格 变量分隔符 矩阵一行中各元素间的分隔符 程序语句关键词分隔符 逗号&#xff0c;分隔显示计算结果的各语句 变量分隔符 矩阵中一行各元素的分隔符点号.数值中的小数点 结构数组的域访问符分号&#xff1b;分隔不想显示计算结果的各语句 矩阵行与行的…...

Android11 动态权限申请

1、单个权限检查及申请 private void checkSinglePermission(){// 在需要的地方&#xff0c;如Activity中if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)! PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this,…...

线性卷积(相关)和圆周卷积(相关)以及FFT之间的关系(AEC举例)

时域自适应滤波算法中的线性卷积和线性相关运算量较大&#xff0c;导致计算复杂度升高&#xff0c;我们更愿意把这两个信号变换到频域&#xff0c;通过频域相乘的方式来取代时域复杂度相当高的卷积或相关运算。 预备知识&#xff1a;线性卷积&#xff08;相关&#xff09;和圆…...

AMD平台,5600X+6650XT,虚拟机安装macOS 14(2024年6月)

AMD平台安装macOS 14的麻烦&#xff0c;要比Intel平台多的多&#xff0c;由于macOS从13开始&#xff0c;对CPU寄存器的读取进行了改变&#xff0c;导致AMD平台只要安装完macOS 13及以后版本&#xff0c;开机后就报五国语言错误&#xff0c;不断重启。改vmx文件&#xff0c;被证…...

Spring源码之手写DI

Spring源码之手写DI 我们来回顾一下前面手写IOC的内容。 一、DI介绍 DI(Dependency injection)依赖注入。对象之间的依赖由容器在运行期决定&#xff0c;即容器动态的将某个依赖注入到对象之中。说直白点就是给Bean对象的成员变量赋值。 在这里我们就需要明白几个问题。 1.…...

从零入手人工智能(5)—— 决策树

1.前言 在上一篇文章《从零入手人工智能&#xff08;4&#xff09;—— 逻辑回归》中讲述了逻辑回归这个分类算法&#xff0c;今天我们的主角是决策树。决策树和逻辑回归这两种算法都属于分类算法&#xff0c;以下是决策树和逻辑回归的相同点&#xff1a; 分类任务&#xff1…...

go语言:两协程并发交替打印数字和字母(代码逐行注释)

要求&#xff1a; 并发两协程交替打印数字和字母。一个协程打印数字&#xff0c;一个协程打印字母。 输出&#xff1a; 12AB34CD56EF78GH910IJ1112KL1314MN1516OP1718QR1920ST2122UV2324WX2526YZ2728 思路&#xff1a; 两个 channel 控制两个协程进行交替打印。sync.WaitG…...

TWM论文阅读笔记

这是ICLR2023的一篇world model论文&#xff0c;用transformer来做世界模型的sequence prediction。文章贡献是transformer-based world model&#xff08;不同于以往的如transdreamer的world model&#xff0c;本文的transformer-based world model在inference 的时候可以丢掉…...

探索ChatTTS项目:高效的文字转语音解决方案

文章目录 &#x1f4d6; 介绍 &#x1f4d6;&#x1f4d2; ChatTTS &#x1f4d2;&#x1f4dd; 项目介绍&#x1f4dd; 项目亮点&#x1f4dd; UI &#x1f388; 项目地址 &#x1f388; &#x1f4d6; 介绍 &#x1f4d6; 在AI技术迅速发展的今天&#xff0c;文本到语音&…...

[Django学习]Q对象实现多字段模糊搜索

一、应用场景 假设我们现在有一个客房系统,前端界面上展示出来了所有客房的所有信息。用户通过客房的价格、面积、人数等对客房进行模糊搜索&#xff0c;如检索出价格在50到100元之间的客房&#xff0c;同时检索面积在20平方米到30平方米之间的客房&#xff0c;此时后端可以借助…...

transdreamer 论文阅读笔记

这篇文章是对dreamer系列的改进&#xff0c;是一篇world model 的论文改进点在于&#xff0c;dreamer用的是循环神经网络&#xff0c;本文想把它改成transformer&#xff0c;并且希望能利用transformer实现并行训练。改成transformer的话有个地方要改掉&#xff0c;dreamer用ht…...

AIGC技术的发展现状与未来趋势探讨

AIGC技术的发展现状与未来趋势探讨 随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;AI生成内容&#xff08;AI-Generated Content&#xff0c;AIGC&#xff09;成为了一项颠覆性的技术&#xff0c;它能够自动生成文本、图像、音频和视频等多种内容。本文将…...

Postman Postman接口测试工具使用简介

Postman这个接口测试工具的使用做个简单的介绍&#xff0c;仅供参考。 插件安装 1&#xff09;下载并安装chrome浏览器 2&#xff09;如下 软件使用说明...

Java开发笔记Ⅱ(Jsoup爬虫)

Jsoup 爬虫 Java 也能写爬虫&#xff01;&#xff01;&#xff01; Jsoup重要对象如下&#xff1a; Document&#xff1a;文档对象&#xff0c;每个html页面都是一个Document对象 Element&#xff1a;元素对象&#xff0c;一个Document对象里有多个Element对象 Node&#…...

一五三、MAC 安装MongoDB可视化工具连接

若没有安装brew包管理工具&#xff0c;在命令行输入安装命令 /bin/bash -c “$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)”上面步骤安装完成后&#xff0c;开始安装MongoDB&#xff0c;输入安装命令&#xff1a; brew tap mongodb/brewbrew u…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...