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.mzph.cn/bicheng/32805.shtml

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

相关文章

如何在Java中进行单元测试?

如何在Java中进行单元测试&#xff1f; 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨如何在Java中进行单元测试&#xff0c;这是一项确保代码质…

力扣刷题 杨辉三角(使用c++ vector解法)

杨辉三角 题目描述示例1示例2提示:代码 题目描述 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例1 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例2 …

上位机图像处理和嵌入式模块部署(mcu和swd接口)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 最近学习mcu的时候&#xff0c;接触了不少调试器&#xff0c;这里面有daplink、st-link v2、j-link v9。虽然模块的形状可能不太一样&#xff0c;但…

基于I2C协议的AHT20温湿度传感器的数据采集

一、I2C总线通信协议 软件I2C 软件I2C&#xff0c;也称为模拟I2C或bit-bang I2C&#xff0c;是一种通过微控制器的通用输入输出&#xff08;GPIO&#xff09;引脚来模拟I2C总线通信的方式。它不依赖于专门的硬件I2C接口&#xff0c;而是通过编程控制GPIO引脚的电平状态来实现I…

快去复习吧+++常用算法及参考算法 递推法++穷举法++排序(冒泡、选择)++查找(顺序、折半)++字符串处理++方程求根++无穷级数求和

接上&#xff1a;常用算法及参考算法 &#xff08;1&#xff09;累加 &#xff08;2&#xff09;累乘 &#xff08;3&#xff09;素数 &#xff08;4&#xff09;最大公约数 &#xff08;5&#xff09;最值问题 &#xff08;6&#xff09;迭代法 常用算法及参考算法 7. 递推法…

如何解决Mac电脑不显示以.开头的文件?

Mac电脑默认是不显示以.开头的文件的&#xff0c;今天我一个朋友第一次编译一个vite的项目时&#xff0c;编译成功后发现API的网址都是http://localhost:48080开头&#xff0c;然后跟我吐槽说这个项目有毛病吧&#xff1f;我心想这明显就是没有设置VITE_BASE_URL啊&#xff1f;…

Vue-观察器(watch)的定义方式引发组件初始值没有渲染成功问题(已解决)

问题描述&#xff1a;在测试环境发现一个问题&#xff0c;打开一张表单的时候&#xff0c;所有字段都成功赋上了值&#xff0c;唯独一个人员组件的值&#xff08;出差人员&#xff09;没有带出&#xff0c;而接口返回的数据是正常的&#xff0c;也就是说不是后端接口的问题&…

JVM专题七:JVM垃圾回收机制

JVM专题六&#xff1a;JVM的内存模型中&#xff0c;我们介绍了JVM内存主要分哪些区域&#xff0c;这些区域分别是干什么的&#xff0c;同时也举了个例子&#xff0c;在运行过程种各个区域数据是怎样流转的。细心的小伙伴可能发现一个问题&#xff0c;在介绍完方法弹栈以后就没有…

指令微调数据集构建方法

指令微调&#xff08;Instruction Tuning&#xff09;&#xff0c;是指使用自然语言形式的数据对预训练后的大语言模型进行参数微调&#xff0c;在一些文章中也称为有监督微调&#xff08;Supervised Fine-tuning&#xff0c;SFT&#xff09;或多任务提示训练&#xff08;Multi…

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

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

CARLA自动驾驶模拟器基础

CARLA 使用服务器-客户端架构运行&#xff0c;其中 CARLA 服务器运行模拟并由客户端向其发送指令。客户端代码使用 API 与服务器进行通信。要使用 Python API&#xff0c;您必须通过 PIP 安装该模块&#xff1a; pip3 install carla-simulator # Python 3World and client 客…

【Android面试八股文】你能说一说View中onTouch、onTouchEvent和onClick的执行顺序吗?

文章目录 一、View中onTouch、onTouchEvent和onClick的执行顺序1.1 分析dispatchTouchEvent()1.1.1 执行顺序1.1.2 代码示例1.1.3 总结一、View中onTouch、onTouchEvent和onClick的执行顺序 要了解 onTouch()、onTouchEvent() 和 onClick() 方法的执行顺序,我们需要深入分析 …

React18中各种Hooks用法总结( 内附案例讲解)

React中各种Hooks用法总结 内附案例讲解 一、useState useState 是一个 React Hook&#xff0c;它允许你向组件添加一个 状态变量。 import React, { FC, memo, useState } from react import { MainContainer } from ./style interface IProps {children?: React.ReactNo…

FRP内网穿透及多级代理的使用

目录 0、前言 1、场景介绍 2、环境准备 2.1 下载frp 2.2 配置一台VPS 2.3 socks5客户端 2.5 网络环境准备 3、Frp设置 3.1 一层代理 3.1 二层代理 4、Frp总结 0、前言 FRP是比较老牌的也是比较流行的反向代理、内网穿透软件。FRP用途和使用场景可以看官方文档&#xff0c;…

JavaScript 预编译与执行机制解析

在深入探讨JavaScript预编译与执行机制之前&#xff0c;我们首先需要明确几个基本概念&#xff1a;声明提升、函数执行上下文、全局执行上下文以及调用栈。这些概念共同构成了JavaScript运行时环境的核心组成部分&#xff0c;对于理解代码的执行流程至关重要。本文将围绕这些核…

美团携手HarmonyOS SDK,开启便捷生活新篇章

华为开发者大会&#xff08;HDC 2024&#xff09;于6月21日在东莞松山湖拉开序幕&#xff0c;通过一系列精彩纷呈的主题演讲、峰会、专题论坛和互动体验&#xff0c;为开发者们带来了一场知识与技术的盛宴。6月23日&#xff0c;《HarmonyOS开放能力&#xff0c;使能应用原生易用…

如何在Java中实现数据加密与解密?

如何在Java中实现数据加密与解密&#xff1f; 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨如何在Java中实现数据加密与解密&#xff0c;这是保…

24-6-23-读书笔记(七)-《文稿拾零》豪尔赫·路易斯·博尔赫斯(第三辑)

文章目录 《文稿拾零》阅读笔记记录总结 《文稿拾零》 《文稿拾零》超厚的一本书&#xff08;570&#xff09;&#xff0c;看得时间比较长&#xff0c;这本书是作者零散时间写的一些关于文学性质的笔记&#xff0c;读起来还是比较无趣的&#xff0c;非常零散&#xff0c;虽然有…

C++系列-String(二)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” #define _CRT_SECURE_NO_WARNINGS #include<string> #include<iostream> #include<list> #include<algorithm> using namespace std; void test_string…

【Android面试八股文】如果 onTouchEvent()方法返回false,onClick()方法还会执行么?

文章目录 一、onTouchEvent 返回 false 的情况二、示例场景分析三、结论在 Android 中,拦截事件通常指阻止事件继续传递或者消费事件,以防止它继续触发其他后续事件(比如 onClick())。 在 onTouchEvent() 方法中,如果返回 false,表示当前 View 没有处理该事件,Android …