预处理指令
以一个井号开头的行都叫做预处理指令。除了#include指令外,我们还经常用到#define指令。#define指令可以告诉编译器,编译时把代码中出现的特定标识当作什么来处理。例如,我们可以这样写:#define NAME_OF_MY_POTENTIAL_GF "ZPR"
这样,编译器会在编译前把代码中出现NAME_OF_MY_POTENTIAL_GF的地方全部替换成"ZPR"。这种替换是无条件的,但是有一个例外:当指定的标识属于某个字符串(被引号引起来)时替换不会发生。例如,下面两行代码会输出NAME_OF_MY_POTENTIAL_GF defined as: ZPRprintf("NAME_OF_MY_POTENTIAL_GF defined as: ");
printf(NAME_OF_MY_POTENTIAL_GF);
其中,后面那个NAME_OF_MY_POTENTIAL_GF被自动替换为"ZPR"。如果哪一天ZPR不要我了,我就可以非常方便地让整个程序适用于另一个MM。
C语言中通常会用#define代替const。例如,下面的代码假设了输入数据n<=2000。#include <stdio.h>
#define MAX 2000
int main()
{
int f[MAX][MAX];
int i,j,n;
scanf("%d",&n);
for ( i=0; i<n; i++ )
{
for ( j=0; j<=i; j++ )
{
f[i][j] = j ? (f[i-1][j] + f[i-1][j-1]) % 10000 : 1;
printf( "%5d" , f[i][j] );
}
printf("/n");
}
return 0;
}
下面的这些指令也是合法的:#define begin {
#define end }
#define and &&
#define or ||
#define定义的指令允许带参数。例如,下面的定义也是合法的:#define sqr(x) x*x
观察下面的这个程序:#include <stdio.h>
#define begin {
#define end }
#define writeln(num) printf("%d/n",num)
#define sqr(x) x*x
int main()
begin
writeln(sqr(100));
writeln(sqr(10+2));
end
程序输出:10000
32
为什么第二个输出的数是32不是144?不要忘了sqr中的x不是一个变量,编译器仅仅是把x替换为10+2,因此sqr(10+2)的结果是10+2*10+2,当然是32咯。为了避免这种情况,这样写就没问题了:#define sqr(x) ( (x) * (x) )
下面这个定义很常用:#define MAX(a,b) ( ((a) > (b)) ? (a) : (b) )
如果你想写出一个很有个性的C代码,反复使用#define是一个不错的选择。例如,这段代码就极具个性,一个光棍的形象跃然于屏幕上。然而,真正把#define发挥得淋漓尽致的,还是要数这段代码。
static声明
在函数中的变量声明前加一个static可以使这个变量具有“记忆性”。观察下面的程序:#include <stdio.h>
void printNum()
{
int a=1;
static int b=1;
printf("%d %d/n", a++, b++);
}
int main()
{
int i;
for ( i=1; i<=5; i++ )
printNum();
return 0;
}
程序输出:1 1
1 2
1 3
1 4
1 5
short类型和int类型的范围
最初我们列出的C语言类型和Pascal类型的对比只能提供一个参考。事实上不同的编译器中short和int的范围可能不同。你可以查一下前面说过的limits.h来确定这些类型的实际范围。通常short是16位整数,long是32位整数。在Windows下Dev-C++中int类型是32位。
对64位整型的处理
和Free Pascal一样,对64位整数类型的处理总是比较麻烦。
首先,对long long赋值很可能会发生错误,你可以在常数后添加一个LL表明这是long long类型。其次,C语言中有些函数是要区分数据类型的,你需要根据数据类型选用恰当的函数。最后,long long类型的输出很可能也有问题,此时你可以用"%lld"来替换"%d",表明输出的是一个long long类型。在Windows下总要装点怪,我在Windows编译时非要用"%I64d"才行。
下面的程序代码在Windows下Dev-C++中一切正常。#include <stdio.h>
#include <stdlib.h>
int main()
{
long long a;
a = -5841314520LL;
a = llabs(a);
a = a + 1;
printf("%I64d",a);
return 0;
}
查漏补缺
这个系列到这里就结束了。还有我没有说到的语法点吗?欢迎大家补充。
后记
C语言速成手册到这里就结束了。这很可能是网上现有的原创C语言教材中讲解最快,篇幅最短的,因为它只适合已经学过其它语言,了解程序设计基础知识的人。这一系列的文章略过了大量的概念讲解、示例代码和习题,你可以自己在网上阅读一些C语言程序作为补充。以后我可能还会写一些类似的文章介绍其它语言。下一步我计划写C与C++的区别,对象和类的介绍以及C++的新特性。再以后我可能会向Java或者Ruby的方向发展。
祝各位努力转C的OIer暑假愉快。
Matrix67原创
转贴请注明出处
相关推荐
RK3588S开发板实战:手把手教你搞定IMX415摄像头驱动配置(附调试日志分析)
本文提供了一份详细的RK3588S开发板配置IMX415摄像头驱动的实战指南。内容涵盖从环境准备、内核驱动编译、设备树节点编写到调试日志分析的完整流程,并重点解析了摄像头调试过程中的常见问题与解决方案,帮助开发者快速完成驱动配置与功能验证。
C语言速成教程
C语言速成教程
激光SLAM总结——Fast LIO / Fast LIO2 / Faster LIO
激光SLAM总结——Fast LIO / Fast LIO2 / Faster LIO 在之前的工作中有接触过LOAM,最近在工作中又接触到Faster LIO相关的工作,于是想着对Fast LIO / Fast LIO2 / Faster LIO这一系列工作进行一个简单的总结,以加深自己对激光SLAM算法的理解,之前总结过的一些和激光SLAM算法相关的博客还有,感兴趣的同学可以一起学习讨论: 激光SLAM总结——VLOAM / LIMO算法解析 激光SLAM总结——LIO-Mapping / LIOM /
C语言速成指南
目录 顺序结构基础 1.printf 2.scanf 分支结构 1.if-else语句 2.if-else的嵌套与缀连 3.逻辑语句 4.switch-case分支 循环结构 1.while循环 2.do-while循环 3.for循环 函数 1.函数的介绍 2.math里的标准函数 数组 1.一维数组 2.二维数组 指针(简单了解即可) 字符串 1.字符串简介 2.字符串处理函数 结构类型 结构体 顺序结构基础 1.printf ...
小样本物体检测
Few-Shot Object Detection with Attention-RPN and Multi-Relation Detector 关键:提出了一个小样本数据集:数据集 步骤: 提取support img为一过滤特征 使用support img的特征来过滤query img,最后将过滤后的特征输入RPN网络中 RPN网络层的输出,会进行多头判断,使用全局信息检测,使用局部信息检测,一对多检测 Attention-Based Region Proposal Network Increme
单节锂电池充电管理芯片应用原理阐述及应用领域
当电池电压超过2.9V时,采用恒流模式对电池充电,充电电流由PROG 管脚和GND之间的电阻RPROG确定。充电电压固定于4.2V,而充电电流可通过一个电阻器进行外部设置当充电电流在达到最终浮充电压之后降至设定值1/10时,WD4054将自动终止充电循环。在待机模式中,WD4054 对 BAT 引脚电压进行监控,只有当 BAT 引脚电压低于再充电阈值电压4.1V时(对应电池容量80%~90%),才会开始新的充电循环,重新对电池进行充电,这就避免了对电池进行不必要的反复充电,有效延长电池的使用寿命。
C语言基础(速成版)
C语言基础(速成版)
【软件分享】天若OCR文字识别V4.48(翻译功能免费)
软件简介 吾爱破解论坛大佬天若幽心开发的一款OCR文字识别工具。支持快速截图识别,以及文本翻译。 下载地址 蓝奏云盘:点击下载 百度网盘:点击下载(密码:4dm4) 坚果云盘:点击下载 天翼云盘:点击下载 微软云盘:点击下载 使用教程 1、下载后对压缩包进行解压 2、双击天若OCR文字识别.exe 3、发现桌面右下角出现软件图标 4、双击软件图标即可开始截图识别 原帖地址 https://www.52pojie.cn/thread-692917-1-1.html ...
C语言速成技巧
3. 实践与练习:理论学习只是C语言学习的一部分,更重要的是实践和练习。可以利用编程工具编写简单的程序并进行调试,通过不断实践和练习来加深对C语言的理解。4. 参与项目开发:如果有机会参与一些C语言项目的开发或者贡献,那将会是非常有益的。通过实践,可以加深对C语言的理解,提升自己的编程能力。5. 寻求专业指导:如果您遇到了一些难以理解的问题,可以寻求教师、导师或者其他专业人士的指导来解决难题,加速学习进程。最后,要提醒您的是,C语言虽然入门相对容易,但其内涵极为丰富,需要不断地深入学习和实践才能够掌握。
从Protocol到硬件控制:揭秘高通UEFI中ABL与XBL的协作机制
本文深入解析了高通UEFI架构中ABL与XBL的协作机制,重点探讨了Protocol通信在硬件控制中的关键作用。通过对比传统GPIO控制方式,揭示了Protocol架构在安全性、可维护性和灵活性方面的优势,并提供了关机充电场景的实战案例分析及调试技巧。
AMD KFD的SDMA Packet 类型和定义解析
本文详细分析了AMD GPU架构中的SDMA(System Direct Memory Access)数据传输机制,重点介绍了其核心数据结构——SDMA Packet。SDMA通过8种主要Packet类型(包括内存拷贝、数据写入、屏障同步、中断触发等)实现高效主机-设备通信。每种Packet采用位域结构和联合体封装设计,在保证功能完整性的同时实现空间优化。这些Packet支持丰富的访问属性和扩展字段,适用于高性能数据搬运、内存初始化、任务同步、性能分析等场景,为GPU计算提供了灵活高效的数据传输解决方案。
c语言速成(适合有编程基础的快速上手!)
c语言一键速成,适合已有相关编程基础的朋友放心食用!
分享Charles抓包 显示<unknown> 解决方案 !
首先电脑上需要安装charles,然后需要设置手机上的WiFi设置,修改配置中的代理设置,把服务器的主机名设置成你电脑当前的ip地址(需要注意的是,你的代理服务器主机名的ip地址要和你当前连的ip地址的网段需要一致)。像 Charles 这样的工具,虽然功能强大,但仍然需要用户具备一定的配置和排障能力,以应对各种复杂的网络环境。通过将 Charles 的 SSL 证书正确安装到移动设备中,并在设置中启用“允许不安全的内容”选项,最终成功解决了这一问题,并准确抓取到所有请求数据。Charles 显示。
半个月有可能速成c语言吗,C语言速成手册(六):其它问题、后记
预处理指令以一个井号开头的行都叫做预处理指令。除了#include指令外,我们还经常用到#define指令。#define指令可以告诉编译器,编译时把代码中出现的特定标识当作什么来处理。例如,我们可以这样写:#define NAME_OF_MY_POTENTIAL_GF "ZPR"这样,编译器会在编译前把代码中出现NAME_OF_MY_POTENTIAL_GF的地方全部替换成"ZPR"。这种替换是...
蓝牙模块HM-10手册
蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。
NTscan扫描工具
ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。
C语言速成手册(零):序言、环境、你的第一个程序
本文目的:介绍C语言最基本的用法,能对付NOIp就行本文特点:没有废话,不讲概念,只介绍语法适宜读者:已经学过其它语言,希望学习C语言的人;特别适合熟练Pascal并想转用C语言的OIer编程环境:就我个人而言,Windows下用Dev-C++,Linux下用Emacs目录:C语言速成手册(一):基本数据类型、标准输出、函数C语言速成手册(二):布尔值、条件判断、循环C语言速成手册(
WINCC7.3破解文件
WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!
《C语言速成》
BIT-0-C语言课程课前准备 养成写博客的习惯 博客的重要性: 1. 自己写博客,是对所学知识的总结 2. 写博客可以记录你学习的一个过程和心得,给面试官更多了解你的机会,同时增加面试的谈资。 3. 写博客说明你是一个愿意分享的人。 优快云 博客园 51CTO-比较推荐 开源中国 自己搭建(服务器+域名; github博客) github的重要性 https://github.com/ 1. 大公司喜欢的东西 2. 了解git --->我是教程 3. 下去先了解,再注册一下github账.
lwip-2.0.3
lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。
C语言-指针详解速成
1.指针是什么 2.指针和指针类型 3.尚未初始化的指针的含义 4.指针运算 5.指针和数组 6.二级指针
C语言基础知识点速成手册(附防秃头指南)
/ 返回类型 函数名(参数列表)a : b;// 三目运算符简洁写法int age;// 使用示例struct Student stu = {"小明", 18, 90.5};printf("%s考了%.1f分", stu.name, stu.score);数组越界:C语言不会自动检查,可能引发莫名错误未初始化变量:局部变量初始值是随机数(编译器不报错!= 和 == 混淆:if(a = 5) 这种写法能编译通过但逻辑错误内存泄漏:malloc后忘记free(长期运行程序的大敌)
C语言速成
C语言基本语法编译预处理作用基本类型函数函数基本结构主函数子函数运算符关键字 编译预处理 作用 简单来说,编译预处理的作用就是将代码变得不像人话。之后才能被编译器编译成汇编进而生成机器码 基本类型 #include<XXXXX.h> 引用头文件 #define XXX AAA 将代码中的XXX 全部替换为 AAA #ifndef
C语言小白速成笔记
666
1小时速成计算机考研408中的C语言
本C语言笔记是笔者听B站UP主[五道口一只鸭]《1小时速成计算机考研408中的C语言|小黄鸭》时整理的,因此建议搭配小黄鸭up主的视频使用本笔记,如有问题可以在评论区指出!
C语言速成手册(一):基本数据类型、标准输出、函数
语句和语句块 和Pascal一样,C语言的每条语句以分号结尾。 和Pascal一样,单词和语句间的空格、回车符对编译没有影响。 C语言的语句块用花括号标识,也就是说字符 { 相当于Pascal的begin,字符 } 相当于Pascal的end; 。语句块中最后一条语句末尾的分号不能省略。 如果语句块里只有一条语句,语句块的标识可以省略。这就好像Pascal代码
C语言一文速成 | 期末保命夺分神器!
用户编程时使用的名字函数声明:在使用函数前,需要声明他的返回类型和参数列表//返回值 函数名(参数列表);函数定义:完整的函数实现,包括函数体。return a+b;数组是一种数据结构,用于存储一组相同类型的数据数组中的元素在内存中是连续存放的数组通过下标来访问元素,下标从0开始。
20天从零掌握C语言:寒假速成攻略
C语言作为一门经典且强大的编程语言,广泛应用于系统软件、嵌入式开发、游戏开发等众多领域。对于想要在编程领域有所建树的技术人员来说,掌握C语言是一个重要的基础。利用寒假的20天时间,通过科学合理的学习规划,从零开始掌握C语言并非难事。本文将为你提供一份详细的20天速成攻略,助你在寒假实现C语言学习的飞跃。
205



被折叠的 条评论
为什么被折叠?



