C语言复习笔记 8

全国计算机二级C语言考试前期复习1(2022年9月份)笔记 计算机二级C语言复习笔记 阅读详情

预处理命令

程序设计语言的预处理的概念:在编译之前进行的处理。 C语言的预处理主要有三个方面的内容:

1. 宏定义;
2. 文件包含;
3. 条件编译。

预处理命令以符号“#”开头。

以#号开头的命令称为预处理命令。

C语言源文件要经过编译、链接才能生成可执行程序:
1)编译(Compile)会将源文件(.c文件)转换为目标文件。对于VC/VS,目标文件后缀为.obj;对于GCC,目标文件为.o。

编译是针对单个源文件的,一次编译操作只能编译一个源文件,如果程序中有多个源文件,就需要多次编译操作。

2)链接(Link)是针对多个文件的,它会将编译生成的目标文件以及系统中的库、组件等合并成一个可执行程序。

关于编译和链接的过程、目标文件和可执行文件的结构、.h文件和.c文件的区别。待研究。

在实际开发中,有时候在编译之前还需要对源文件进行简单的处理。例如,我们希望自己的程序在Windows和Linux下都能够运行,那么就要在Windows下使用VS编译一遍,然后在Linux下使用GCC编译一遍。但是现在有个问题,程序中要实现的某个功能在VS和GCC下使用的函数不同(假设VS下使用 a(),GCC下使用 b()),VS下的函数在GCC下不能编译通过,GCC下的函数在VS下也不能编译通过,怎么办呢?

这就需要在编译之前先对源文件进行处理:如果检测到是VS,就保留 a() 删除 b();如果检测到是GCC,就保留 b() 删除 a()。

这些在编译之前对源文件进行简单加工的过程,就称为预处理(即预先处理、提前处理)。

预处理主要是处理以#开头的命令,例如#include

宏定义

宏定义是预处理命令的一种,它允许用一个标识符来表示一个字符串。

#define N 100就是宏定义,N为宏名,100是宏的内容。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。

宏定义是由源程序中的宏定义命令#define完成的,宏代换是由预处理程序完成的。

对宏定义的几点说明

1) 宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的替换。字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查,如有错误,只能在编译已被宏展开后的源程序时发现。(注意与C语言带双引号的字符串区别开,这里指的是广义上的字符串)

2) 宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起替换。

3) 宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令。例如:

#define PI 3.14159

int main(){
    // Code
    return 0;
}

#undef PI

void func(){
    // Code
}

//表示PI只在main函数中有效,在func中无效。

4) 宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换,例如:

#include <stdio.h>
#define OK 100
int main(){
    printf("OK\n");
    return 0;
}
//该例中定义宏名OK表示100,但在 printf 语句中 OK 被引号括起来,因此不作宏代换,而作为字符串处理。

5) 宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名,在宏展开时由预处理程序层层代换。

6) 习惯上宏名用大写字母表示,以便于与变量区别。但也允许用小写字母

7) 可用宏定义表示数据类型,使书写方便。例如:
#define UINT unsigned int
在程序中可用UINT作变量说明:
UINT a, b;

应注意用宏定义表示数据类型和用typedef定义数据说明符的区别。宏定义只是简单的字符串代换,是在预处理完成的,而typedef是在编译时处理的,它不是作简单的代换,而是对类型说明符重新命名。被命名的标识符具有类型定义说明的功能。

这里写图片描述

typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。
在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。

C语言中带参数的宏定义

C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数,这点和函数有些类似。

对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。

带参宏定义的一般形式为:
#define 宏名(形参列表) 字符串
在字符串中含有各个形参。

带参宏调用的一般形式为:
宏名(实参列表);
例如:

#define M(y) y*y+3*y  //宏定义
// Code
k=M(5);  //宏调用
在宏调用时,用实参5去代替形参y,经预处理宏展开后的语句为k=5*5+3*5。

对带参宏定义的说明

1) 带参宏定义中,形参之间可以出现空格,但是宏名和形参列表之间不能有空格出现。

2) 在带参宏定义中,不会为形式参数分配内存,因此不必指明数据类型。而在宏调用中,实参包含了具体的数据,要用它们去代换形参,因此必须指明数据类型。

这一点和函数是不同的:在函数中,形参和实参是两个不同的变量,都有自己的作用域,调用时要把实参的值传递给形参;而在带参数的宏中,只是符号的替换,不存在值传递的问题。

带参数的宏和函数很相似,但有本质上的区别:宏展开仅仅是字符串的替换,不会对表达式进行计算;宏在编译之前就被处理掉了,它没有机会参与编译,也不会占用内存。而函数是一段可以重复使用的代码,会被编译,会给它分配内存,每次调用函数,就是执行这块内存中的代码。

#include <stdio.h>

int SQ(int y){
  return ((y)*(y));
}

int main(){
    int i=1;
    while(i<=5){
        printf("%d^2 = %d\n", (i-1), SQ(i++));
    }
    return 0;
}

运行结果:
1^2 = 1
2^2 = 4
3^2 = 9
4^2 = 16
5^2 = 25

注意一点 printf()函数是从右开始入栈的。

C语言条件编译详解

假如现在要开发一个C语言程序,让它输出红色的文字,并且要求跨平台,在 Windows 和 Linux 下都能运行,怎么办呢?

这个程序的难点在于,不同平台下控制文字颜色的代码不一样,我们必须要能够识别出不同的平台。

Windows 有专有的宏_WIN32,Linux 有专有的宏linux,以现有的知识,我们很容易就想到了 if else,请看下面的代码:

#include <stdio.h>
int main(){
    if(_WIN32){
        system("color 0c");
        printf("http://c.biancheng.net\n");
    }else if(__linux__){
        printf("\033[22;31mhttp://c.biancheng.net\n\033[22;30m");
    }else{
        printf("http://c.biancheng.net\n");
    }

    return 0;
}

但这段代码是错误的,在 Windows 下提示 linux 是未定义的标识符,在 Linux 下提示 _Win32 是未定义的标识符。对上面的代码进行改进:

#include <stdio.h>
int main(){
    #if _WIN32
        system("color 0c");
        printf("http://c.biancheng.net\n");
    #elif __linux__
        printf("\033[22;31mhttp://c.biancheng.net\n\033[22;30m");
    #else
        printf("http://c.biancheng.net\n");
    #endif

    return 0;
}

#if、#elif、#else 和 #endif都是预处理命令,整段代码的意思是:如果宏 _WIN32 的值为真,就保留第 4、5 行代码,删除第 7、9 行代码;如果宏 linux 的值为真,就保留第 7 行代码;如果所有的宏都为假,就保留第 9 行代码。

这些操作都是在预处理阶段完成的,多余的代码以及所有的宏都不会参与编译,不仅保证了代码的正确性,还减小了编译后文件的体积。


这种能够根据不同情况编译不同代码、产生不同目标文件的机制,称为条件编译。条件编译是预处理程序的功能,不是编译器的功能。

#if 命令

#if 命令的完整格式为:
#if 整型常量表达式1
    程序段1
#elif 整型常量表达式2
    程序段2
#elif 整型常量表达式3
    程序段3
#else
    程序段4
#endif

它的意思是:如常“表达式1”的值为真(非0),就对“程序段1”进行编译,否则就计算“表达式2”,结果为真的话就对“程序段2”进行编译,为假的话就继续往下匹配,直到遇到值为真的表达式,或者遇到 #else。这一点和 if else 非常类似。

需要注意的是,#if 命令要求判断条件为“整型常量表达式”,也就是说,表达式中不能包含变量,而且结果必须是整数;而 if 后面的表达式没有限制,只要符合语法就行。这是 #if 和 if 的一个重要区别。

#elif 和 #else 也可以省略,如下所示:

#include <stdio.h>
int main(){
    #if _WIN32
        printf("This is Windows!\n");
    #else
        printf("Unknown platform!\n");
    #endif

    #if __linux__
        printf("This is Linux!\n");
    #endif

    return 0;
}

#ifdef 命令

#ifdef 命令的格式为:
#ifdef  宏名
    程序段1
#else
    程序段2
#endif
它的意思是,如果当前的宏已被定义过,则对“程序段1”进行编译,否则对“程序段2”进行编译。

#ifndef 命令

#ifndef 命令的格式为:
#ifndef 宏名
    程序段1 
#else 
    程序段2 
#endif
与 #ifdef 相比,仅仅是将 #ifdef 改为了 #ifndef。它的意思是,如果当前的宏未被定义,则对“程序段1”进行编译,否则对“程序段2”进行编译,这与 #ifdef 的功能正好相反。

区别

最后需要注意的是,#if 后面跟的是“整型常量表达式”,而 #ifdef 和 #ifndef 后面跟的只能是一个宏名,不能是其他的。

C语言期末复习|最后的总结 在 C 语言中,自定义标识符是由程序员为变量、函数、结构体、联合体、枚举、宏、标签等命名时使用的名称。1.大小写字母含义不同。APH 和 aph 代表不同的变量。2.C语言的标识符由字母、数字和下划线组成。3.第一个字符必须是字母或下划线。4.第一个字符不能是数字。9ab是非法的用户标识符。5.C语言中的变量名属于标识符。6.C 语言的关键字(保留字)是具有特殊含义的标识符,它们被 C 语言的编译器保留,不能用作变量名、函数名等普通标识符。7.main。 阅读详情

相关推荐

C语言期末考试-复习错题

东莞城院的C语言考试复习资料和考试样题 https://pan.baidu.com/s/18xDvW1DM6z-Wt16rheHeZw hwv0 1:(F)计算机能直接执行机器指令和汇编指令但不能直接执行高级语言中的语句 机器只能运行机器语言 2:(F)一个C语言程序由一个或多个函数组成,其中至少必须包含一个main函数 ...

菜鸟大佬的博客 5677

C语言复习笔记

C语言,编程入门基础。初学者必备!!!

lonelysnowman的博客 2930

【C语言】C语言期末复习

大学生C语言期末考试复习资料

2302_81115588的博客 2229

【C语言】 知识点汇总--基础知识点梳理(超全超详细)

目录一、从源代码到exe二、基本数据类型三、字符在屏幕上的显示原理四、溢出现象五、类型转换规律六、短路问题七、指针变量类型的作用 八、指针类型的扩展——多级指针九、指针类型的扩展——指针数组十、指针类型的扩展——数组指针十一、一维数组-名-特性十二、二维数组-名-特性十三、大端存储-小端存储十四、函数在源代码中的三种状态十五、堆区与栈区的区别十六、函数的执行原理十七、枚举类型十八、typedef二十、const二十一、全局/局部变量生命周期与作用域二十二、static静态变量二十三、extern二十四、宏d

jia_03的博客 2万+

C语言学习笔记基础完整

C语言基础部分学习笔记全部

C语言学习笔记

C语言学习笔记,C语言学习笔记,qsort排序。。。。。。。。。。。。。。。。。。。。。。。。。。。。

图及其应用c语言实现(数据结构复习最全笔记)(期末复习最新版)

图 一.图的基本概念 1.图的定义 图是由顶点(vertex)集合及顶点间的关系组成的一种数据结构。Graph=(V,E)Graph=(V,E)其中,顶点集合 V={x|x∈某个对象数据集}V={x|x∈某个对象数据集} 是有穷非空集合;E={(x,y)|x,y∈V}E={(x,y)|x,y∈V} 是顶点间关系的有穷集合,也叫边(edge)集合。Path(x,y)Path(x,y)表示从顶...

markconca的博客 1万+

图像去畸变(相机成像、畸变模型)

首先通过上一步相机标定得到畸变参数和相机内参,同时,由于图像去畸变都是在归一化相机坐标系下进行的,而图像都是像素坐标,所以需要先通过相机内参矩阵将图片上的像素点从像素坐标系转变到归一化坐标系,再通过畸变参数在归一化坐标上进行去畸变的操作。由于畸变是发生在世界点通过透镜投影到相机坐标系这个过程中的,所以去畸变操作是在相机坐标系下进行的。(如图,Pd即为畸变后成像点)3.读取图像和各个参数,调用去畸变函数(opencv自带的cv.undistort函数),就可以完成对图像的去畸变处理,进而得到去畸变的图像。

lm5688jjupm1n28的博客 1051

C语言基础笔记(全)

printf函数可以输出各种类型的数据,包括整型、浮点型、字符型、字符串型等,实际原理是printf函数将这些类型的数据格式化为字符串后,放入标准缓冲区,然后将结果显示到屏幕上printf函数根据format给出的格式打印输出到stdout(标准输出)和其他参数中代码格式%c字符%d带符号整数%f浮点数%s一串字符%u无符号整数%x无符号十六进制数,用小写字母%X无符号十六进制数,用大写字母%p一个指针%%一个'%'符号。

señoritaw的博客 1万+

【Android】汽车电源管理:深入解析CarPowerManager与Suspend To RAM的交互机制

本文深入解析了Android Automotive OS中CarPowerManager与Suspend To RAM(深度睡眠)的交互机制。详细阐述了从车辆发出睡眠请求,到CarPowerManagementService协调应用状态,最终通过内核进入低功耗睡眠的完整流程,并探讨了唤醒机制、开发者实践及功耗优化策略,为车机应用开发与系统优化提供关键指导。

weixin_28339967的博客 289

当图像配准遇见边缘计算:低功耗设备的优化实践

本文探讨了在边缘计算环境下优化图像配准技术的实践方法,重点解决低功耗设备如树莓派和Jetson Nano上的算力瓶颈问题。通过算法轻量化、硬件加速和内存优化等策略,实现了毫秒级图像配准,适用于智能安防、移动医疗等实时性要求高的场景。

weixin_29054195的博客 387

C语言学习及复习笔记-【8】C作用域规则

​ 全称为"实际参数"是在调用时传递给函数的参数. 实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数。在调用函数时,实参将赋值给形参。正确地初始化变量是一个良好的编程习惯,否则有时候程序可能会产生意想不到的结果,因为未初始化的变量会导致一些在内存位置中已经可用的垃圾值。当局部变量被定义时,系统不会对其初始化,您必须自行对其初始化。

文斗士的专栏 382

让 AI 学会“慢思考”:MCP Sequential Thinking 深度部署与使用指南

摘要: MCP Sequential Thinking 是一种让AI具备"慢思考"能力的技术,通过动态调整思维路径解决复杂问题。本文详细介绍了在Windows、macOS和Linux系统下的部署方法,包括环境准备、配置文件修改等步骤。该技术通过"产生想法-评估需求-修正路径"的循环机制,显著提升AI在代码设计、数学证明等复杂任务中的表现。文章还提供了验证安装方法、使用示例和常见问题解答,帮助开发者解锁AI的深层思考能力。(149字)

weixin_43236925的博客 1907

《汇编语言:基于X86处理器》第8章 复习题和练习,编程练习

本篇记录《汇编语言:基于X86处理器》第8章 复习题和练习,编程练习的学习笔记

chenyijun的专栏 1179

如何利用ADS中的耦合线设计带通滤波器并转换为HFSS模型

耦合线带通滤波器是一种常用的微带滤波器形式,由多个长度为四分之一波长的耦合线节组成,在所需频点形成谐振,构成滤波器的频率响应特性。首先我们先来了解一下耦合线带通滤波器的电路结构,见下图:包括两对耦合线,中间为公共连接点,其中两对耦合线的偶奇模阻抗为(Z1e,Z1o)和(Z2e,Z2o,端口输入阻抗为Z0)。2.指定一个初始奇偶模值,ADS优化出一个合适的结果,通过奇偶模值利用linecalc工具计算出微带耦合线尺寸。假设中心频率为2GHz,则对应频点的电长度为。5.运行结果,两个软件仿真结果基本一致。

auqihc的博客 2227

超声波法检测局部放电的原理与实现

摘要:超声波法通过捕捉局部放电产生的声波信号进行检测,系统由超声波传感器、信号调理单元和数据采集系统组成。其核心应用是局放源定位,主要采用时差定位法和声-电联合定位法。该方法具有抗电磁干扰强、定位精确等优点,但也存在信号衰减大、传播路径复杂等缺点,典型应用于变压器、GIS等设备的在线监测与故障诊断。

start_up_go的博客 374

C语言复习笔记(一)C语言概论初识

从今天开始没有复习c语言的要抓紧时间了哦,如果不会复习的话,不妨跟着我一起来复习吧,现在小编已经结课了,反正闲着也是闲着,所以小编想用五天时间对c语言做一个系统性复习。欢迎大家一起来学习,互相指正,互相进步哦!加油,干就完了,奥利给!!! 不bb了,直入正题 第1章 C语言概论初识 (温馨提示,如果你看起来毫不费力,你就已经是大佬了哦,如果有些吃力,那就赶紧抓紧时间再学一遍吧,这个复习不针对小白哦) 最简单的C语言程序 【例1.1】要求在屏幕上输出:机械电子工程 解题思路: 在主函数中用printf函数原样

royal_77QAQ的博客 1588

【突变检验合集】含Pettitt突变检验等

突变检验方法合集

WW、forever的博客 3534

C/C++ 知识复习笔记

C/C++ 核心知识摘要

m0_63816268的博客 1953

EtherCAT主站SOEM -- 24 -- 基于STM32F767IGT6搭建自己的SOEM-EtherCAT主站

以上就是EtherCAT主站SOEM – 23 – 基于STM32F767IGT6搭建自己的SOEM-EtherCAT主站的内容。有不明白的地方欢迎留言;有建议欢迎留言,我后面编写文档好改进。创作不容,如果文档对您有帮助,记得给个赞。

常驻客栈的博客--嵌入式EtherCAT 3554

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C语言与Linux复习笔记

从定义角度分类库函数:是系统提供的已经封装好的函数。在使用时,需要包含相应的头文件。例如,常用的输入输出函数printfscanf等包含在<stdio.h>头文件中;字符处理函数isalphaisupper等包含在<ctype.h>头文件中;字符串处理函数strlenstrcpy等包含在<string.h>头文件中。这些库函数为程序员提供了便捷的功能,减少了重复开发的工作量。用户自定义函数:当系统提供的库函数无法满足特定需求时,程序员可以自己定义函数。

sbhsjjs的博客 1128

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【C语言】C语言复习笔记

为什么要学C语言? 1972年,美国贝尔实验室的 D.M.Ritchie 在B语言的基础上最终设计出了一种新的语言,他取了BCPL的第二个字母作为这种语言的名字,这就是C语言。 总所周知,任何东西的盛行都只是一个阶段,语言也是如此。但是,C语言是个例外,一个矗立了半个世纪的语言,其中好坏,我想应该不难了之。 C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语言不但执行效率高而且可移植性好,可以用来开发应用软件、驱动、操作系统等。C语言也是其它众多高级语言的鼻祖.

Cain Xcy的博客 2010

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C语言复习笔记: PTA题集整理

C语言复习笔记: PTA题集整理 文章目录C语言复习笔记: PTA题集整理@[toc]C语言取模运算及辗转相除法易错内容:将/运算符当作%使用解答代码:算法实现1:算法实现2求出大于m的最小素数:PTA题集输入格式:输出格式:输入样例:输出样例:代码解答:课堂代码:存在问题 14 输出15改进后的代码:相似内容:遍历元素 并 输出或者返回数值 找素数7-3 求幂级数展开的部分和 (20分)输入格式:输出格式:输入样例:输出样例:需要注意的地方:代码内容解答代码1:修改后的代码:最佳情侣

weixin_44640697的博客 4950

C语言复习(专升本复习)

一个简单的C语言程序前言一、一个简单的C语言程序1.什么是C语言程序2.C语言的基本结构3.注意点 前言 提示:用于复习和分享c语言内容 因为要备考所以java暂时不更新建议看完c再去看java 所有顺序是按井冈山大学专升本复习大纲复习 提示:以下是本篇文章正文内容,下面案例可供参考 一、一个简单的C语言程序 示例: #inculde<stdio.h> void mian { //输出一句话 printf("hello word"); system("pause

qq_46567882的博客 4083

简单复习C语言

今天开始看晴神的《算法笔记》,由于本人大一学习完C语言后,一直在学习和使用Cpp的语法,以致于一些C语言的一些简单问题都不记得了,就顺便简单复习下C语言吧。 1.变量类型 _int16,_int32,_int64对应short,int,long long。 %f尽管是double和float的输出格式,但是可以将double的输出格式写出%lf 还有一点尽量多使用double,不要使用float,...

algsup 1215
上一篇: C语言复习笔记 7
下一篇: C语言复习笔记 9
henhaoji_123
博客等级 码龄10年 260粉丝 283原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值