C语言综述

系列文章目录

  1. C语言综述1
  2. C语言字符集2
  3. C语言词法元素3
  4. C语言表达式4
  5. C语言语句5
  6. C语言声明6
  7. C语言预处理指令7
  8. C语言头文件8


前言

蓝色问号代表个人理解   绿色代表来源   红色问号代表尚有疑问

为什么要读标准?因为全面、权威,所有答案都在标准里面!
哪些人适合浏览本系列文章?不清楚C语言程序的组成,以及每个组成部分的详细内容
持续更新,码字不易,求点赞收藏


1、程序语言

 程序语言是用来定义计算机指令执行流程的形式化语言,每种程序语言都包含一整套词汇和语法规范

分类

  1. 机器语言:以二进制代码表示的指令集合,是计算机唯一能直接识别和执行的语言
  2. 汇编语言:汇编语言是将机器语言的二进制代码指令用简单符号(助记符)表示的一种语言
  3. 高级语言:高级语言是将计算机内部的许多相关机器操作指令,合并成一条高级程序指令,并且屏蔽具体操作细节的语言
  4. 语言的抽象化程度越高,程序员的工作越少,随之而来的是语言运行效率降低?

实现

  1. 一个特定的软件集合,它运行在一个受到特殊控制任选的特定翻译环境,为一个特定的执行环境实现程序的翻译,并支持函数在该执行环境中的执行C89定义
  2. 一个实现就是这一整套词汇和语法规范的支持环境,是语言思想、逻辑的实体。比如,python就有许多实现(Pypy,Cpython,Jython等)?

逻辑?

  1. 逻辑即规则、规律,比如,1 + 1 = 2
  2. 简单的逻辑组成复杂的逻辑,比如,与门和异或门组成一个半加器,半加器组成全加器
  3. 程序员思考问题的解决,再将问题的解决过程中的逻辑,使用语言来表示,从而产生程序
  4. 程序按规定产生相应的行为

行为C89定义

  1. 实现定义的行为:对于正确的程序构件和数据,依赖于实现特性的行为,比如,有符号整数右移时高位如何传递
  2. 地域特定的行为:取决于每个实现的民族、文化、语言和当地习俗,比如,对除26个小写英文字母之外的字符,islower()是否返回真值
  3. 未定义的行为:使用不可移植或错误的程序结构、错误的数据或不确定值的对象,且标准未提出要求的的行为,处理方式范围从完全忽略到终止翻译或执行,比如,整数溢出
  4. 未规定的行为:对于正确的程序构件或数据,标准未提出要求的的行为,比如,函数实参求值的顺序

2、一致性

  1. 严格一致性的程序应仅使用本标准中规定的语法和库的功能,不应产生任何未指定、未定义或实现定义行为的输出,并且不应超过任何最小实现限制
  2. 具有一致性的实现分为宿主型和独立型
  3. 宿主型遵从实现,需能接受任何严格一致性的程序
  4. 独立型遵从实现,需能接受使用的库功能仅限于标准内<float.h> 、<limits.h> 、 <stdarg.h> 、<stddef.h> 内容的严格一致性的程序
  5. 一致性的实现可以具有扩展(包括附加的库函数),前提是它们不会改变任何严格一致性程序的行为
  6. 实现应随附包括所有实现定义的特性和拓展的文档

限制和约束?

  1. 翻译软件可能都翻译成限制,这就是非英语母语的不方便了
  2. 限制是对范围、程度、位置等的规定,比如,最大值、最小值
  3. 约束是对语言元素的进一步语法或语义的解释或限制,比如,函数声明符的约束

2、环境

一个实现在两个数据处理系统环境中翻译C源文件和执行C程序,他们的特征定义并约束了根据符合一致性实现的语法和语义规则构造的 C程序的结果。C89定义

  1. 翻译环境
  2. 执行环境

2.1、翻译

在这里插入图片描述

不同的翻译单元通信方式

  1. 调用具有外部链接的标识符的函数
  2. 操作具有外部链接的标识符的对象
  3. 操作数据文件

诊断
具有一致性的实现应为包含违反任何语法规则或约束的每个翻译单元生成至少一条诊断消息(以实现定义的方式去识别)
error * 999
请添加图片描述

2.2、执行

 定义了两个执行环境:独立型和宿主型。
 在这两种情况下,当执行环境调用指定的C函数时,程序就会启动。在程序启动之前,应初始化静态存储器中的所有对象(设置为其初始值)。此类初始化的方式和时间安排另行规定。程序终止时,控制权返回到执行环境。

2.2.1、独立型

 程序启动时调用的函数的名称和类型由实现定义,除此之外没有其他的外部标识符。独立程序可用的任何库都是由实现定义的。独立环境中程序终止的效果由实现定义。

2.2.2、宿主型

2.2.2.1、程序的启动

 两种方式,只要有main函数即使没有头文件也可以正常编译运行

int main(void){
    int i = 0;
}
int main(int argc,char *argv[]){
    int i = 0;
}

argc 和 argv

  1. argc和argv用于传递预环境中预先确定的参数
  2. argc代表argv的大小,需为非负值,argv[argc]为空指针,若argc大于0,argv[1]~argv[argc -1]是程序参数
  3. argv[0] 是程序名,若不能从环境中获得程序名,argv[0][0] 应为空字符
  4. argc和argv的值程序都能进行修改,程序结束时保持最后一次修改
#include<stdio.h>
int main(int argc,char *argv[]){
    for( int i = 0; i < argc; i++ ){
        printf("%s\n",argv[i]);
    }
    return 0;
}
命令行输入.\test.exe a b c d
输出
P:\Project\Cproject\test.exe
a
b
c
d

 使用符号链接还可以用同一套代码完成不同的工作

#include<bits/stdc++.h>
using namespace std;
int main(int argc,char *argv[]){
    for(int i = 0; i < argc; i++ ){
        cout << argv[i] << endl;
    }
    if(strcmp(argv[0], "a"))
        cout << 'a';
    else if(strcmp(argv[0], "b"))
        cout << 'b';
    return 0;
}
ln -s test a
ln -s test b	//在busybox中使用,分别输出a,b
2.2.2.2、程序的运行
  1. 访问易变型对象、修改对象、修改文件或调用执行这些操作的函数都是副作用的,表达式可能是副作用的
  2. 在一个序列点前所有副作用都应该已完成,若在两个序列点之间中断,对象的值只能看上一个序列点
  3. 具有自动存储持续时间的每个对象的实例都与块相关联,比如,函数里调用函数,之前函数的对象的值是保留的

副作用
side effects:执行环境的状态改变

序列点?

  1. 对参数求值后对函数的调用
  2. *以下运算符的第一个操作数的结尾:逻辑与、逻辑或、条件表达式?、 逗号 *
  3. 完整表达式的结尾
  4. 在序列点,易变型对象是稳定的

编译器优化

  1. 所有表达式都按照语义指定的方式进行计算。如果实际实现可以推断表达式的值没有被使用,并且没有产生所需的副作用,则不需要计算表达式的一部分
  2. char = char + char,若不会溢出,可能忽略整型升格
  3. float = float * double,若结果与升格双精度后的结果相同,可能使用单精度算法计算

易变型对象

  1. volatile:指示对象是易变的,确保不被编译器优化掉,每次都需重新读取值
  2. 平时的代码没有设置编译器优化,实现语义和抽象语义是一一对应的
2.2.2.3、程序的终止
  1. 从对函数main的初始调用返回,return
  2. 调用函数exit
  3. quick_exit() -c11
  4. return相当于调用相应参数的exit函数
  5. 如果main函数执行不指定值的返回,则返回到主机环境的终止状态是未定义的

3、其他

3.1、翻译限定值

一致性的实现应当 C89定义
在这里插入图片描述

3.2、数值限定

一致性的实现应当 来源9
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、总结

在这里插入图片描述

问题
1、中文翻译和英语原版还是有些差距的,比如
在这里插入图片描述
在这里插入图片描述

请添加图片描述








以上纯属个人观点,欢迎大佬批评指正
  1. https://blog.csdn.net/init33/article/details/121258745 ↩︎

  2. https://blog.csdn.net/init33/article/details/121318734 ↩︎

  3. https://blog.csdn.net/init33/article/details/121319873 ↩︎

  4. https://blog.csdn.net/init33/article/details/121323883 ↩︎

  5. https://blog.csdn.net/init33/article/details/121323943 ↩︎

  6. https://blog.csdn.net/init33/article/details/121323932 ↩︎

  7. https://blog.csdn.net/init33/article/details/121323958 ↩︎

  8. https://editor.csdn.net/md/?articleId=121323994 ↩︎

  9. https://blog.csdn.net/weixin_42856843/article/details/81989737 ↩︎

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值