C语言词法元素

【C/C++基础】01_C/C++语言词汇 1C/C++语言词汇在C语言中使用的词汇分为六类:标识符,关键字,运算符,分隔符,常量,注释符等。   1.1 标识符    在程序中使用的变量名、函数名、标号等统称为标识符。除库函数的函数名由系统定义外,其余都由用户自定义。C 规定,标识符只能是字母(A~Z,a~z)、数字(0~9)、下划线(_)组成的字符串,并且其第一个字符必须是字母或下划线。    以下标识符是合法的:       a,x,... 阅读详情

系列文章目录

  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语言程序的组成,以及每个组成部分的详细内容
持续更新,码字不易,求点赞收藏


前言

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

1、概述

  1. token,国标翻译为单词,但是感觉不准确?
  2. 翻译3~6阶段所有词法元素为预处理token,7、8阶段已转换成了token
  3. 转换为token的每个预处理token应具有token的词汇形式
  4. 若 ’ 或 “ 字符与最后一个类别的预处理单元(不属于上述范围内的任一非白空类符)匹配,行为未定义
  5. 预处理单元可以被白空类单元分隔(注释或白空类符或两者都有)
  6. 若直至某个给定字符为止的输入流字符序列已被分析为预处理单词,则下一个预处理单词是可构成预处理单词的最长的字符序列 ,比如, x ++ + ++y 是不符合定义的,x++已被分析为预处理单词,后面的字符构成不了预处理单词
#include<bits/stdc++.h>
using namespace std;

int main(int argc,char *argv[]){
   
   
    int x = 0, y = 0, c;
    c = x ++ + ++ y;
    cout << x  << endl << y << endl << c;  //输出 1 1 1 
    return 0;
}

token
在这里插入图片描述
pp-token
在这里插入图片描述

2、关键字

关键字 说明
auto 声明自动变量
break 跳出当前循环
case 开关语句分支
char 声明字符型变量或函数返回值类型
const 定义常量,如果一个变量被 const 修饰,那么它的值就不能再被改变
continue 结束当前循环,开始下一轮循环
default 开关语句中的"其它"分支
do 循环语句的循环体
double 声明双精度浮点型变量或函数返回值类型
else 条件语句否定分支(与 if 连用)
enum 声明枚举类型
extern 声明变量或函数是在其它文件或本文件的其他位置定义
float 声明浮点型变量或函数返回值类型
for 一种循环语句
goto 无条件跳转语句
if 条件语句
int 声明整型变量或函数
long 声明长整型变量或函数返回值类型
register 声明寄存器变量
return 子程序返回语句(可以带参数,也可不带参数)
short 声明短整型变量或函数
signed 声明有符号类型变量或函数
sizeof 计算数据类型或变量长度(即所占字节数)
static 声明静态变量
struct 声明结构体类型
switch 用于开关语句
typedef 用以给数据类型取别名
unsigned 声明无符号类型变量或函数
union 声明共用体类型
void 声明函数无返回值或无参数,声明无类型指针
volatile 说明变量在程序执行中可被隐含地改变
while 循环语句的循环条件

3、标识符

描述
标识符是由非数字字符(包括下划线和大小写字母)及数字构成的序列,其第一个字符应是非数字字符,不同的标识符取决于有效字符的不同
分类

  1. 结构成员或标记
  2. 联合成员或标记
  3. 枚举成员或标记,枚举成员称枚举常量
  4. 自定义类型名
  5. 标签名
  6. 宏名或宏形参

约束

  1. 组成标识符的字符序列不应与组成关键字的字符序列相同
  2. 标识符最大长度没有具体限制。标准规定宏名或无外部链接的标识符前31个字符定为有效字符(不忽略大小写),外部链接的标识符前6个字符定为有效字符(可忽略大小写),具体由实现定义,存在有效字符相同、非有效字符不同的两个标识符的行为未定义

3.1、标识符作用域

3.1.1、作用域范围

  1. 函数(function)作用域:仅标签具有函数作用域,通过冒号隐式声明(go to语句)
  2. 文件(file)作用域:声明标识符的声明符或类型说明符出现在所有块或参数列表之外,在翻译单元的末尾终止,比如,全局变量
  3. 块(block)作用域:声明标识符的声明符或类型说明符出现在块内或函数定义中的参数声明列表内,终止于},比如,函数形参
  4. 函数原型(function prototype)作用域:如果声明标识符的声明符或类型区分符出现在函数原型(不是函数定义的一部分)的参数声明列表中,在函数声明的末尾终止
#include<bits/stdc++.h>
using namespace std;

int test1(int a, int b);        //a、b函数原型作用域
                                //buf1、buf2块作用域
int test1(int buf1, int buf2){
   
     
    return buf1 + buf2;
}
int N = 100, M;              //M, N文件作用域

int main()
{
   
   
    label: M = test1(N, M);     //label函数作用域
    if(M < 1000){
   
   
        goto label;
    }
    cout << M;              //输出 1000
    return 0;
}

  1. 结构、联合和枚举标记的作用域在声明标记的类型区分符时,标记出现后立即开始
  2. 每个枚举常量的作用域都在其在枚举符列表中定义常量的枚举符后立即开始
  3. 任何其他标识符的作用域都是在其声明程序完成后立即开始
#include<bits/stdc++.h>
using namespace std;

enum test{
   
         //枚举作用域开始
    a = 100,  //枚举常量作用域开始
    b
}num;
int main()
{
   
   
    cout << 100 + num;   
    return 0;
}

3.1.2、链接(linkage)

通过链接可在不同作用域或同一作用域,引用同一个对象或函数

  1. 外部链接(external):一组翻译单元中指向同一个对象或函数,只需extern,若文件范围内有可见声明则与其具有相同的链接,若文件范围内没有可见声明则为外部链接
  2. 内部链接(internal):一个翻译单元中指向同一个对象或函数,文件作用域 + static,作用:别的文件不能访问
  3. 无链接(none):指向独一无二的实体,声明为对象或函数以外的任何标识符;声明为函数参数的标识符;没有extern的块内声明的对象标识符
  4. 如果在翻译单元中,同一标识符同时出现在内部和外部链接中,则该行为未定义
  5. 函数标识符和文件作用范围的对象默认外部链接
//test2.cpp
int b = 100;

//test1.cpp
#include<bits/stdc++.h>
using namespace std;
static int b = 1000;
void test_fuc(){
   
   
    extern int b;
    cout << b;
}
int main()
{
   
   
    test_fuc();
    return 0;
}
//多文件编译$g++ -o test test1.cpp test2.cpp,输出1000,有extern但是文件作用范围内有可见声明,所以extern b的链接是内部链接
//将test1的static int b = 1000;语句删除,再次运行输出100,有extern且文件作用范围内没有可见声明,所以extern b的链接是外部链接
//将test2的int b = 100;语句前加上static,再次编译,编译失败

3.1.3、命名空间

不同类别的标识符具有不同的命名空间

类别 消除歧义方法
标签名称 通过标签声明和使用的语法消除歧义
结构、联合和枚举的标记 通过跟随关键字struct、union或enum来消除歧义
结构或联合的成员 通过. 或 ->运算符访问成员时使用的表达式类型消除歧义
所有其他标识符称为普通标识符 在普通声明器中声明或作为枚举常量声明
//正常编译
#include<bits/stdc++.h>
using namespace std;
struct test1
{
   
   
    int a = 1;
}test1;
int main()
{
   
   
    int test1 = 100;
    return 
编译原理词法分析器——C语言实现 词法分析器 (一)基本内容 实现一个可以识别C语言(子集)词法的程序,识别源代码中的每个词,并且将结果保存下来。 可识别的词包括 头文件:以#include开头的过滤为头文件 保留字:“auto”, “break”, “case”, “char”, “const”, “continue”, “default”, “do”, “double”, “else”, “enum”, “extern”,“f... 阅读详情

相关推荐

编译原理实验:C语言实现词法与语法分析

flex(快速词法分析器生成器)是一个用于生成扫描器的工具,它从一组规则中生成C语言的源代码文件。这些规则指定了如何将输入文本分割为“标记”(tokens)。flex的工作原理可以概括为以下几个步骤:定义Token模式:通过正则表达式定义文本模式,这些模式对应于源代码中的各种语言符号,如关键字、操作符、标识符等。关联动作:为每个模式关联一段C语言代码,这段代码将在扫描器匹配到相应模式时执行。生成扫描器。

weixin_29496633的博客 498

Linux内存压力测试工具【memtester】详且精

对Linux下的压力测试工具memtester有一个比较人性化的概述,以及避坑心得。

weixin_44118923的博客 1万+

IBM x3650M4服务器更换主板后,导入原有硬盘阵列信息

x3650m4服务器主板坏了,更换好的主板,需要导入原来硬盘的里面的阵列信息 1、开机有提示信息,按C导入配置 2、按Y继续 3、点击start进入阵列卡配置 4、选择configurations 1,点击preview 5、预览硬盘的阵列信息,点击import导入 6、导入成功,可以查看到阵列信息 7、重启服务器,进入操作系统 如果重启找不到操作系统,重启按f12,手动选择从onboard sas controller启动,进入系统一次后面重启就会自动找到并引导系统了。 8、有时候导入阵列

zds00virtue的博客 2万+

海康威视web控件开发+vue结合做网页开发

需求:vue的项目,需要在页面展示出海康的硬盘录像机连接的摄像头的实时监控画面以及回放功能. 准备:web开发包(包含插件以及demo,在海康官网即可下载32位64位的都有.那些需要积分下载的博主良心不疼么.) 点击这里下载:链接: https://pan.baidu.com/s/12FrbycWyWWyiRJH5Yd1tPA 提取码: gam5 开始开发: 1.安装demo目录下的WebComponentsKit.exe插件(根据自己的浏览器以及系统选择32位还是64位的插件) 2.打.

u013682258的博客 8484

从零开始用QP框架开发STM32:事件驱动编程实战指南(附状态机设计技巧)

本文详细介绍了如何使用QP框架在STM32上实现事件驱动编程,包括状态机设计技巧和嵌入式开发实践。通过对比传统前后台系统和RTOS,展示了QP框架在资源占用、实时性和代码可维护性方面的优势,并提供了从环境搭建到高级状态机设计的完整指南。

h6i7j8的博客 1173

正弦波产生电路_文氏桥振荡

本文以文氏桥振荡为基础产生正弦波,介绍了原理、计算、应用时需要注意的一些点,并给出了实测可用的电路模板

白鹤忘机的博客 3万+

【华为OD机考真题】- 构成的正方形数量(B卷-100分)(Java版)

🔔本文收录于「最新最全华为OD机试真题(Java版)」专栏,手把手带你零基础教学华为OD机试。本题集提供最优题解思路,解题步骤,代码解析,复杂度分析及最优题解源码等,支持多语言题解,助你轻松拿捏OD机考,一举上岸!安利大家关注&&收藏&&订阅!题库正在疯狂收录中,up!up!up!! 🚫提醒:拒绝一切代考/替考,违法必究!专栏所写题库均精心搜集于互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验所撰,欢迎订阅。    💗订阅福利:一次订阅,可永久免费阅读,提供在线答疑解惑,后续题库更新

**My Coding Family** 1349

Scrapy爬虫之热门网站数据爬取--------第2关

第2关:小说网站玄幻分类第一页小说爬取 任务描述 本关任务:爬目标网页的3本小说保存到本地MySQL数据库,目标网页为全书网玄幻分类首页。 注:考虑到单机(非分布式)爬虫的爬取时间和测试平台的压力,我们不爬更多页数的小说了,可以作为课下作业自己完善。 xpath匹配:循环获取相同标签下的内容 通过网页分析,我们在获取小说的章节名时,发现他们都在标签<DIV class="clearfix dirconone">下的li的a中: 这时,我们可以先把其中所有的li标签先获取到: titles = r

weixin_44949187的博客 2836

逻辑回归:利用Python实现二分类算法

通过使用Python编写的代码,我们可以训练逻辑回归模型并进行预测。接下来,我们将实现逻辑回归算法的训练函数。训练函数将接受训练数据集X和对应的标签y,以及学习率alpha和迭代次数num_iterations。训练完成后,我们可以使用训练得到的参数theta来进行预测。在这个例子中,我们有一个包含4个样本的训练数据集X,每个样本有两个特征。在这个例子中,如果预测概率大于等于0.5,则预测为类别1,否则预测为类别0。现在,我们可以使用训练函数来训练模型。根据给定的样本x_new,预测函数将返回相应的类别。

XlltEditor的博客 326

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: C语言字符集
下一篇: C语言表达式
init33
博客等级 码龄5年 18粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值