当前位置: 首页 > 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 语言变得更加现代化、灵活和安全,特别是在泛型编程、静态断言、多线程和内存对齐等方面提供了显著的增强。

http://www.lryc.cn/news/380691.html

相关文章:

  • 【网络安全的神秘世界】已解决burpsuite报错Failed to start proxy service on 127.0.0.1:8080
  • 【C#】使用数字和时间方法ToString()格式化输出字符串显示
  • Mac系统主机名变为bogon的解决方案
  • 行列式和矩阵的区别
  • MATLAB复习
  • Android11 动态权限申请
  • 线性卷积(相关)和圆周卷积(相关)以及FFT之间的关系(AEC举例)
  • AMD平台,5600X+6650XT,虚拟机安装macOS 14(2024年6月)
  • Spring源码之手写DI
  • 从零入手人工智能(5)—— 决策树
  • go语言:两协程并发交替打印数字和字母(代码逐行注释)
  • TWM论文阅读笔记
  • 探索ChatTTS项目:高效的文字转语音解决方案
  • [Django学习]Q对象实现多字段模糊搜索
  • transdreamer 论文阅读笔记
  • AIGC技术的发展现状与未来趋势探讨
  • Postman Postman接口测试工具使用简介
  • Java开发笔记Ⅱ(Jsoup爬虫)
  • 一五三、MAC 安装MongoDB可视化工具连接
  • ULTRAINTERACT 数据集与 EURUS 模型:推动开源大型语言模型在推理领域的新进展
  • 【leetcode刷题】面试经典150题 , 27. 移除元素
  • 红队内网攻防渗透:内网渗透之内网对抗:横向移动篇PTH哈希PTT票据PTK密匙Kerberoast攻击点TGTNTLM爆破
  • springBoot不同module之间互相依赖
  • [modern c++] 类型萃取 type_traits
  • 函数模板和类模板的区别
  • ChatGPT 提示词技巧一本速通
  • 【windows解压】解压文件名乱码
  • 使用Flink CDC实时监控MySQL数据库变更
  • 学生课程信息管理系统
  • 如何看待鸿蒙HarmonyOS?