C语言C99标准、C11标准新增加的特性

C语言标准

C语言从其诞生至今,经历了多个标准的更新,主要标准包括:

  1. C89/C90 (ANSI C / ISO/IEC 9899:1990):这是C语言的第一个官方标准,由ANSI于1989年发布,后被ISO采纳为国际标准,发布于1990年。它为C语言的语法、库函数等方面设定了基础规范,广泛被采用并成为后续标准的基础。

  2. C99 (ISO/IEC 9899:1999):发布于1999年,C99标准在C89的基础上进行了大量扩展,引入了如可变长度数组(VLAs)、限制指针(restrict)、内联函数、复数类型、新的整数类型(如_Bool)、改进的预处理功能等特性。

  3. C11 (ISO/IEC 9899:2011):发布于2011年,C11标准在C99基础上进一步完善,加入了对多线程编程的支持(通过<threads.h>库)、增强了Unicode支持(通过<uchar.h>)、引入了原子操作和线程内存模型、静态断言、匿名结构和联合、宏默认参数等新特性,并提高了语言的安全性。

  4. C18 (ISO/IEC 9899:2018):发布于2018年,这个版本主要是对C11标准的小幅修订和澄清,没有引入重大的新特性,主要目的是解决C11标准中发现的问题和歧义,提高标准的清晰度和一致性。C18有时也被视为C11的一个修正版。

目前,最新的官方标准是C18,但需要注意的是,并非所有的编译器都已经完全实现了最新标准的所有特性,开发者在编写代码时应考虑目标编译器的实际支持情况。

C89标准(也称为C90标准)

C89是C语言的第一个官方国际标准,正式名称为ISO/IEC 9899:1990。它是在1989年由美国国家标准协会(ANSI)制定并发布的,故得名C89,随后在1990年被国际标准化组织(ISO)采纳,成为国际标准。C89标准定义了C语言的基础语法、关键字、数据类型,并引入了标准库函数,比如stdio.hstdlib.h等,确立了C语言的基本形态。它的特点是简洁、可移植性强且易于理解,成为了后续C语言教材和实现的基础。

C99标准(ISO/IEC 9899:1999)

C99是C语言的一个重要更新,发布于1999年。它是C89标准的后续版本,引入了许多新特性和改进,旨在适应不断发展的编程需求和技术环境。C99标准增加了诸如限制指针(restrict)、内联函数、可变长度数组(VLAs)、复数类型(_Complex)、新的整型常量(如_Bool)、改进的浮点数处理以及对编译器限制的放宽等特性。此外,C99还引入了//风格的单行注释,使代码更加易读。尽管C99引入了许多现代化的特性,但直到今天,并非所有编译器和开发环境都完全支持C99的所有特性。

下面是一些C99标准新增特性及其示例代码:

1. restrict指针

void copy_memory(void *restrict dest, const void *restrict src, size_t n) {for(size_t i = 0; i < n; ++i) {((char*)dest)[i] = ((const char*)src)[i];}
}

在这个例子中,restrict关键字告诉编译器,destsrc指向的内存区域不会重叠,这使得编译器可以进行更多的优化。

2. 内联函数

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

使用inline关键字建议编译器直接将函数体插入每次调用处,以减少函数调用的开销。

3. 可变长度数组(VLAs)

#include <stdio.h>int main() {int n = 5;int arr[n]; // 数组大小在运行时决定for(int i = 0; i < n; ++i) {arr[i] = i;}for(int i = 0; i < n; ++i) {printf("%d ", arr[i]);}return 0;
}

这里,数组arr的大小是在运行时根据变量n的值确定的。

4. 复数类型

#include <complex.h>
#include <stdio.h>int main() {double complex z = 3.0 + 4.0*I;printf("The complex number is: %f + %fi\n", creal(z), cimag(z));return 0;
}

使用_Complex关键字定义复数类型,并通过crealcimag函数获取实部和虚部。

5. 指定成员初始化器

struct Person {char name[20];int age;
};int main() {struct Person p = {.name = "Alice", .age = 30};printf("Name: %s, Age: %d\n", p.name, p.age);return 0;
}

在结构体初始化时,可以直接指定成员的名字进行初始化,提高了代码的清晰度。

6. 对齐处理

#include <stdalign.h>alignas(16) char buffer[100]; // 确保buffer对齐在16字节边界上int main() {// ... 使用对齐后的bufferreturn 0;
}

使用_Alignas关键字可以指定变量或类型的对齐要求。

C11 (ISO/IEC 9899:2011)

C11标准引入了若干新特性,以下是一些主要特性的示例代码:

1. 多线程支持

#include <threads.h>
#include <stdio.h>void thread_function(void* arg) {printf("Hello, World! from thread\n");
}int main() {thrd_t t;if(thrd_create(&t, thread_function, NULL) == thrd_success) {thrd_join(t, NULL); // 等待线程结束}printf("Hello, World! from main thread\n");return 0;
}

这段代码展示了如何使用C11中的<threads.h>库创建和等待一个线程完成。

2. Unicode支持

#include <stdio.h>
#include <uchar.h>int main() {char32_t unicode_char = U'ação'; // 使用UTF-32编码存储Unicode字符printf("Unicode character: %C\n", unicode_char);return 0;
}

通过<uchar.h>头文件,可以使用Unicode字符,并利用宽字符输出函数打印。

3. 静态断言

#include <assert.h>#define MAX_SIZE 100void func(int size) {_Static_assert(size <= MAX_SIZE, "size exceeds maximum allowed");// ... 函数逻辑
}int main() {func(99); // 正常执行// func(101); // 如果取消注释,编译时会报错return 0;
}

_Static_assert允许在编译时验证条件,如果条件不满足,则编译失败。

4. 匿名结构与联合

#include <stdio.h>struct Info {int id;union {char name[20];// 可以有其他成员};
};int main() {struct Info info = {1, "Alice"};printf("ID: %d, Name: %s\n", info.id, info.name);return 0;
}

C11允许在结构体内部直接定义匿名的联合,简化了结构体的设计。

5. 原子类型和操作

#include <stdatomic.h>
#include <stdio.h>
#include <threads.h>atomic_int counter = ATOMIC_VAR_INIT(0);void increment(void* arg) {for(int i = 0; i < 100000; ++i) {atomic_fetch_add_explicit(&counter, 1, memory_order_relaxed);}
}int main() {thrd_t threads[10];for(int i = 0; i < 10; ++i) {thrd_create(&threads[i], increment, NULL);}for(int i = 0; i < 10; ++i) {thrd_join(threads[i], NULL);}printf("Counter: %d\n", atomic_load_explicit(&counter, memory_order_relaxed));return 0;
}

通过<stdatomic.h>头文件,可以使用原子类型和操作进行线程安全的计数,这里展示了如何在多线程环境下安全地增加一个计数器的值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/31683.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

echarts+vue2实战(一)

目录 一、项目准备 二、(横向分页)柱状图 2.1、动态刷新 2.2、UI调整 2.3、分辨率适配 三、(竖向平移)柱状图 3.1、平移动画 3.2、不同数值显示不同颜色 四、(下拉切换)折线图 4.1、切换图表和分辨率适配 4.2、UI调整 五、(三级分类)饼图 5.1、数据切换 六、圆环…

使用Tkinter创建带查找功能的文本编辑器

使用Tkinter创建带查找功能的文本编辑器 介绍效果代码解析创建主窗口添加菜单栏实现文件操作实现查找 完整代码 介绍 在这篇博客中&#xff0c;我将分享如何使用Python的Tkinter库创建一个带有查找功能的简单文本编辑器。 效果 代码解析 创建主窗口 import tkinter as tkcl…

Offset Explorer 连接SASL PLAIN鉴权的Kafka

1、填写Kafka信息 2、配置鉴权信息 Security 选择 SASL PLAINTEXT JAAS Config 配置账号密码 org.apache.kafka.common.security.plain.PlainLoginModule required username"账号"password"密码";

[Vulnhub] Troll FTP匿名登录+定时任务权限提升

信息收集 IP AddressPorts Opening192.168.8.104TCP:21,22,80 $ nmap -sC -sV 192.168.8.104 -p- --min-rate 1000 Nmap scan report for 192.168.8.104 (192.168.8.104) Host is up (0.0042s latency). Not shown: 65532 closed tcp ports (conn-refused) PORT STATE SER…

openh264 宏块级码率控制源码分析

openh264 宏块级码率控制函数关系 宏块级核心函数分析 WelsRcMbInitGom函数 功能&#xff1a;openh264 码率控制框架中宏块级码率控制函数&#xff0c;根据是否启用GOM QP来决定如何设置宏块的QP值&#xff0c;以控制编码的质量和比特率。原理过程&#xff1a; 函数参数&…

“打造智能售货机系统,基于ruoyi微服务版本开源项目“

目录 # 开篇 售货机术语 1. 表设计说明 2. 页面展示 2.1 区域管理页面 2.2 合作商管理页面 2.3 点位管理页面 3. 建表资源 3.1 创建表的 SQL 语句&#xff08;包含字段备注&#xff09; 1. Region 表 2. Node 表 3. Partner 表 4. 创建 tb_vending_machine 表的 S…

学习java第一百零六天

Spring的后置处理器 BeanPostProcessor&#xff1a;Bean的后置处理器&#xff0c;主要在bean初始化前后工作。 InstantiationAwareBeanPostProcessor&#xff1a;继承于BeanPostProcessor&#xff0c;主要在实例化bean前后工作&#xff1b; AOP创建代理对象就是通过该接口实现…

用LangChain调用Ollama的时候一个小问题

说来让人无语&#xff0c;简单记录一下。安装好Ollama后&#xff0c;我们通常通过访问http://127.0.0.1:11434来测试其是否正常&#xff0c;通常会出来“Ollama is running”&#xff0c;然后我习惯性地从Chrome把地址拷贝到VS Code&#xff0c; oembed OllamaEmbeddings(bas…

【启明智显产品介绍】Model3C工业级HMI芯片详解专题(一)芯片性能

【启明智显产品介绍】工业级HMI芯片Model3C详解&#xff08;一&#xff09;芯片性能 Model3C 是一款基于 RISC-V 的高性能、国产自主、工业级高清显示与智能控制 MCU&#xff0c;配置平头哥E907&#xff0c;主频400MHz&#xff0c;强大的 2D 图形加速处理器、PNG/JPEG 解码引擎…

【Conda】修改 Conda 默认的虚拟环境位置

文章目录 问题描述分析与解决查看默认安装位置修改 .condarc 文件修改权限 参考资料 问题描述 Conda 的虚拟环境默认安装在 C 盘。时间久了&#xff0c;C 盘上的内存会被大量占用&#xff0c;影响电脑性能。于是想到修改虚拟环境的默认存放位置&#xff0c;改到自定义的位置。…

找不到d3dx9_43.dll无法继续执行代码的几种解决方法

在工作或生活使用电脑都会遇到丢失dll文件应用无法启动的情况&#xff0c;比如你安装完一款你最喜欢的游戏在启动的时候提示系统缺少d3dx9_39.dll、d3dx9_40.dll、d3dx9_41.dll、d3dx9_42.dll、d3dx9_43.dll、xinput1_3.dll 文件而无法正常游戏&#xff0c;或你在工作的时候安装…

分享HTML显示2D/3D时间

效果截图 实现代码 <!DOCTYPE html> <head> <title>three.jscannon.js Web 3D</title><meta charset"utf-8"><meta name"viewport" content"widthdevice-width,initial-scale1,maximum-scale1"><meta n…

图神经网络学习笔记

文章目录 一、图神经网络应用领域分析二、图基本模块定义三、邻接矩阵的定义四、GNN中常见任务五、消息传递计算方法六、多层GCN的作用七、GCN基本模型概述八、图卷积的基本计算方法九、邻接的矩阵的变换十、GCN变换原理解读 本笔记参考自b站up主小巴只爱学习的图神经网络教程 …

【Android面试八股文】你能说一说View绘制流程与自定义View注意点吗?

文章目录 一、自定义View的构造函数以及各参数的用法二、自定义View的几种方式三、自定义View的绘制流程四、自定义View需要注意的一些点五、举个例子一、自定义View的构造函数以及各参数的用法 在Android中,自定义View通常需要提供多个构造函数,以适应不同的使用场景。主要…

创建OpenWRT虚拟机

环境&#xff1a;Ubuntu 2204&#xff0c;VM VirtualBox 7.0.18 安装必备软件包&#xff1a; sudo apt update sudo apt install subversion automake make cmake uuid-dev gcc vim build-essential clang flex bison g gawk gcc-multilib g-multilib gettext git libncurses…

C语言中操作符详解(一)

众所周知&#xff0c;在我们的C语言中有着各式各样的操作符&#xff0c;并且在此之前呢&#xff0c;我们已经认识并运用了许许多多的操作符&#xff0c;都是诸君的老朋友了昂 操作符作为我们使用C语言的一个非常非常非常重要的工具&#xff0c;诸君一定要加以重视&#xff0c;…

大模型如何改变世界?李彦宏:未来至少一半人要学会“提问题“

2023年爆火的大模型&#xff0c;对我们来说意味着什么&#xff1f; 百度创始人、董事长兼CEO李彦宏认为&#xff0c;“大模型即将改变世界。” 5月26日&#xff0c;李彦宏参加了在北京举办的2023中关村论坛&#xff0c;发表了题为《大模型改变世界》的演讲。李彦宏认为&#…

在centos服务器上部署nginx容器

1.下载nginx镜像 2.导入镜像 docker load -i nginx.tar 3. 查看导入的镜像 docker images 4. 运行镜像 docker run -d -p 80:80 --name my-nginx nginx 5. 访问Nginx 其他 1.查看所有正在运行的Docker容器:docker ps 2.查看所有镜像:docker images 3.使用Docker命令…

Html集成 vue3,js文件访问vue内的方法和属性

标题页面代码如下 如下代码,假设index.js文件中有个 getUserInfo函数, 1.我们首先需要把 let vm app.mount(‘#app’);的vm传到js文件中,这样才能访问vue中定义的元素和函数 2.vue中定义的函数需要return出去才能在js文件中调用 3.js文件中,调用vue中的函数作为参数即可传参到…

为什么我在 PostgreSQL 中 Commit 很慢?

有时&#xff0c;我们的一位客户会查看数据库中最耗时的语句&#xff08;使用pg_stat_statements或pgBadger&#xff09;&#xff0c;并发现COMMIT排名靠前。通常&#xff0c;COMMIT这是 PostgreSQL 中非常快的语句&#xff0c;因此值得研究。在本文中&#xff0c;我将探讨速度…