C程序设计语言读书笔记(4)

《嵌入式Linux C语言应用程序设计》读书笔记 《嵌入式Linux C语言应用程序设计》读书笔记《嵌入式Linux C语言应用程序设计》读书笔记《嵌入式Linux C语言应用程序设计》读书笔记《嵌入式Linux C语言应用程序设计》读书笔记《嵌入式Linux C语言应用程序设计》读书笔记《嵌入式Linux C语言应用程序设计》读书笔记《嵌入式Linux C语言应用程序设计》读书笔记《嵌入式Linux C语言应用程序设计》读书笔记《嵌入式Linux C语言应用程序设计》读书笔记《嵌入式Linux C语言应用程序设计》读书笔记《嵌入式Linux C语言应用程序设计》读书笔记 立即下载


        被调用函数通过return 语句向调用者返回值,return语句的后面可以跟任何表达式:

        return (表达式);

        在必要时,表达式将被转化为函数的返回值类型。

        声明语句:

        double sum, atof(char []);

        表明sum是一个double 类型的变量,atof函数带有一个char[]类型的参数,且返回一个double类型的值。

        C语言不允许在一个函数中定义其他的函数。

        对于某些中等规模的程序,最好只用一个头文件存放程序中各部分共享的对象,需要用时需要用#include包含进来。

        用static声明限定外部变量与函数,可以将其后声明的对象的作用域限定为编译源文件的剩余部分。

示例程序: 

//file1:
static int staticNum ;
int num ;

static int getStaticNum()
{
	return staticNum;
}

int getNum()
{
	return num;
}
//file2:
#include <stdio.h>
extern int staticNum;
extern int getStaticNum();

extern int num;
extern int getNum();

int main()
{
//	printf("%d\n", staticNum); 
//  printf("%d\n", getStaticNum());	
	printf("%d\n",num);
	printf("%d\n",getNum());
	return 0;
}

        如果将file2文件的注释取消,那么是不能通过编译的。因为staticNum和getStaticNum函数都是static的,所以它们的作用域只能在file1中。

        以上程序的输出是两个0,所以static变量如果没有赋初始值,那默认就是0。

        static类型的内部变量是一种只能在某个特定函数中使用但一直占据存储空间的变量。

示例程序:

#include <stdio.h>
void testStaticVal()
{
	static int num = 3;
	num++;
	printf("%d\n", num);
}
int main()
{
	testStaticVal();
	testStaticVal();
         testStaticVal();
	return 0;
}

        以上程序的输出数字是4 5 6。所以static变量只在第一次进入程序块时被初始化。并且具有记忆性。

        变量的声明或初始化只能在做花括号开始,即左花括号后要集中声明或初始化一批变量。如下的写法是错的:

int main()
{
	int a = 1;
	a = a + a;
	int b = 9;
	return 0;
}

        因为int b = 9没有紧跟在int a = 1之后。

        变量初始化的表达式必须为常量表达式。

数组初始化:

        如果初始化表达式的个数比数组元素少,则对外部变量,静态变量和自动变量来说,没有初始化表达式的元素将被初始化为0。而局部变量数组的值未定义。  

 宏替换:

        宏定义的形式如下:

        #define 名字 替换文本

        可以把一个较长的宏定义分成若干行,这时需要在待续的行末加上一个反斜杠符\ 。

        #define指令定义的名字的作用域从其定义开始,到被编译的源文件的末尾行结束。

        宏定义中也可以使用前面出现的宏定义。

        替换只对记号进行,对括在引号中字符串不起作用。例如,如果YES是一个通过#define指令定义的名字,则在printf("YES")或YESMAN中将不执行替换。

        宏定义可以带参数:

        比如#define max(A, B) ((A) > (B) ? (A) : (B))

语句:

        x = max(p + q, r + s);

被替换为下列形式:

        x = ((p + q) > (r + s) ? (p + q) : (r + s));

        使用带参数宏要注意一些问题,请看:

示例程序:

#include <stdio.h>
#define max(A, B) ((A) > (B) ? (A) : (B))
#define square(x) x * x
int main()
{
	int i = 0;
	int j = 1;
	int x = 5;
	printf("%d\n", max(i++, j++));
	printf("%d\n", i);
	printf("%d\n", j);
	printf("%d\n", square(x + 1));
	return 0;
}

        程序输出为2 1 3 11。.因为max(i++,j++)被替换成了(i++) > (j++) ? (i++) : (j++),所以大的数字j自增了两次。

        最后并没有输出我们理想的答案(5 + 1) * (5 + 1),因为squre(x + 1)被替换为了:x + 1 *  x + 1

所以:

        #define square(x) x * x

应该改写成

        #define square(x)  (x) * (x)

        可以通过#undef指令取消名字的宏定义,这样做可以保证后续的调用是函数调用,而不是宏调用:

#undef getchar
int getchar(void) {...}

        形式参数不能用带引号的字符串替换。但是,如果在替换文本中,参数名以#作为前缀则结果被拓展为由实际参数替换该参数的带引号的字符串。如:

        #define dprint(expr) printf(#expr " = %g\n", expr)

使用语句:

        dprint(x/y);

调用该宏时,该宏被拓展为:

        printf("x/y"" = %g\n",x/y);

为了防止一个源文件重复包含一个头文件,可以采用条件包含的方法。

如:

#if !defined(HDR)
#define HDR
/* hdr.h文件的内容放在这里*/
#endif

等价为:

#ifndef HDR
#define HDR
/* hdr.h文件的内容放在这里*/
#endif

        下面的这段预处理代码首先测试系统变量SYSTEM,然后根据该变量的值确定包含哪个版本的头文件:

#if SYSTEM == SYSV
    #define HDR "sysv.h"
#elif SYSTEM == BSD
    #define HDR "bsd.h"
#elif SYSTEM ==MSDOS
    #define HDR "msdos.h"
#else
    #define HDR "default.h"
#endif
#include HDR

 

C程序设计语言读书笔记.chm C程序设计语言读书笔记 C程序设计语言读书笔记 立即下载

相关推荐

python文件转为可执行文件(.exe)的详细步骤

本文详细介绍了如何从零开始把python文件打包成为可执行文件(.exe)。

m0_67093160的博客 3万+

c程序设计语言读书笔记,C程序设计语言读书笔记

第一章 导言第一章带领大家进入了C语言的世界,但是我感觉,如果没有一些基础,要想完全理解这一章的内容,还是有些困难的。在允许使用某种类型变量值的任何场合,都可以使用该类型的更复杂的表达式。无论文本从何处输入,输出到何处,其输入/输出都是按照字符流的方式处理。文本流是由多行字符构成的字符序列,而每行字符则由0个或多个字符组成,行末是一个换行符。当把数组名用作参数时,传递给函数的值是数组起始元素的位置...

weixin_39849287的博客 543

电磁波成像技术全解析:从γ射线到无线电波的应用实践

本文全面解析电磁波成像技术,从γ射线到无线电波的应用实践。详细介绍了不同波长电磁波的特性与实用场景,包括医疗影像、工业检测、安防监控等领域。特别探讨了X射线、红外热成像、毫米波雷达等前沿技术的实战应用,为读者提供技术选型指南和操作技巧。

weixin_29305337的博客 292

《C程序设计语言》学习笔记

C语言提供了一个称为typedef的功能,它用来建立新的数据类型名。例如,声明将Length定义为与int具有同等意义的名字。typedef声明并没有创建一个新声明,它只是为某个已存在的类型增加了一个新的名称而已。typedef声明也没有增加任何新的语义:通过这种方式声明的变量与通过普通声明的变量具有完全相同的属性。

Leon_Chenl的博客 1605

FOC观测器之龙伯格观测器

状态观测器: 理论依据:根据控制理论,如果一个系统能够完全通过其检测到的输出值来重构其系统状态,则认为该系统是可观测的。其作用于无传感器转子的位置和速度的检测反馈,再作用到PARK逆变换和转矩磁链控制上。 Luenberger观察器原理图: Luenberger观测器的离散化: (其观测器的闭环参数为经验验证值) 引入估测电流( iα,iβ )的反馈值并离散化(T 为采样时间),可得...

ShawnChan的博客 2万+

VS2022打包C#安装包(最新、最全)

VS2022打包C#安装包(最新、最全)

qq_37959253的博客 9892

《C语言程序设计》读书笔记(第13章——文件)

第13章 文件

二木成林 729

在windows10/11中使用ipatool提取苹果app安装包ipa文件

本文介绍了在Windows10/11系统中使用ipatool工具下载苹果App安装包(.ipa)的详细步骤。首先需准备Windows电脑、AppleID账号并下载ipatool工具;具体操作包括:登录AppleID、搜索应用、获取购买授权、查看历史版本及下载指定版本。关键步骤强调获取授权的重要性,并提供了常用命令速查表,帮助用户完成从登录到下载的全过程。该教程适用于需要获取旧版本App或进行应用测试的场景。

zhengshaolin128的博客 2573

《C语言程序设计》读书笔记(第6章——循环控制)

第6章 循环控制

二木成林 588

T507 buildroot linux4.9之RLT8211F 1000M以太网开发调试

调试T507的gmac,解决该RTL8211F 1000m以太网中调试遇到的问题

目前从事linux驱动开发,多交流多学习吧 686

Coze实战:解锁多Bot协同与条件分支工作流的奥秘

本文详细介绍了在字节跳动Coze平台实现多Bot协同与条件分支工作流的方法。首先阐述了Coze平台的功能优势,包括丰富的插件、知识库和工作流功能。随后分步骤讲解了多Bot协同的实现:从准备工作、创建Bot到协同配置,并提供了电商客服的实例演示。在条件分支工作流部分,详细说明了条件节点的作用类型、条件设定方法以及具体配置操作,强调测试优化的重要性。最后通过电商平台综合案例,展示了多Bot协同与条件分支的实际应用效果,并针对常见问题提供解决方案。文章为开发者在Coze平台上构建智能应用提供了实用指导,有助于提升

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 449

【C语言学习笔记】《C程序设计语言》读后感

Warning: 为了避免非零基础人群感到身体不适、头晕恶心、易怒及粗口,请不要查看以下内容。 文章目录前言读书感悟总结 前言 截至目前为止,我已经“抄”完了10篇《C程序设计语言》 读书笔记。刚好升到了博客2级,这也是我第一次在优快云发帖子记录读书感悟。与其说是感悟…不如说是照抄原文。由于这是我第一本完整阅读的计算机书,也是我第一次使用优快云,在措辞上有些不知所措。 我本来是打算写几篇浓缩度...

返璞归真的博客 4787

基于YOLOv8的违规抽烟/打电话检测系统:从数据集构建到部署实战

模型优点缺点精度高速度慢(5 FPS)SSD速度快小目标检测差YOLOv5平衡性好官方支持停止YOLOv8最新、最快、最准需要PyTorch环境YOLOv8相比前代:骨干网络升级(C2f模块)无锚框检测(Anchor-Free)动态任务对齐分配(TaskAlignedAssigner)支持分类/检测/分割/姿态估计。

YOLO 97

c 语言1 4,《c程序设计语言》读书笔记(一)1~4

本文都是自己重读《c程序设计语言》时的笔记:自己的一些思考:1、printf和getchar的区别:scanf printf 可以输入输出各种类型的变量,比如int float char,而且同时输入 输出多个也可以 如scanf("%d,%d",&a,&b);getchar putchar 只能输入输出char类型的变量,而且只能同时输入输出一个字符scanf()函数取数据是遇...

weixin_39885469的博客 143

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

《c程序设计语言》读书笔记(一)1~4

本文都是自己重读《c程序设计语言》时的笔记: 自己的一些思考: 1、printf和getchar的区别:  scanf printf  可以输入输出各种类型的变量,比如int float char,而且同时输入 输出多个也可以 如scanf("%d,%d",&a,&b);  getchar putchar 只能输入输出char类型的变量,而且只能同时输入输出一个字符  scanf()函数

889

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

《C语言程序设计》读书笔记(第4章——顺序程序设计)

第4章 顺序程序设计

二木成林 623

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

《c程序设计语言》读书笔记-4.13-递归版本reverse函数

#include #include #include #include void reverse(char s[],int i,int len) { int c,j; j = len - (i + 1); if(i < j) { c = s[i]; s[i] = s[j]; s[j] = c;

lvchahp的专栏 772

《c程序设计语言》读书笔记-5.4-指针实现strend

#include #include #include #include #include #include int strend(char *s,char *t) { char *stas = s; char *stat = t; for(;*s;s++) ; for(;*t;t++) ; for(;*s ==

lvchahp的专栏 693

告别AI抽卡:基于工作流与参数优化的Stable Diffusion可控生成实践

在AI图像生成领域,Stable Diffusion等扩散模型的核心原理是通过迭代去噪过程将随机噪声转化为符合文本描述的图像。这一过程虽然强大,但其固有的随机性(源于初始种子和采样过程)常导致生成结果难以预测,消耗大量算力与时间成本。其技术价值在于将深度学习与创意生成结合,但实际应用时,用户常陷入反复调整提示词和参数的“抽卡”式低效循环。为此,工程化的解决方案应运而生,通过预设工作流和智能参数优化,将随机性转化为可控的生产流程。具体而言,工作流将生成任务分解为多阶段节点(如线稿生成、细节填充、风格化),而参

weixin_33946605的博客 337

《c程序设计语言》读书笔记-3.4-数字转字符串

#include #include #include #include #include void reverse(char s[]) { int c,i,j; for(i = 0,j = strlen(s) - 1;i < j;i++,j--) c = s[i],s[i] = s[j],s[j] = c; } void itoa(int n,cha

lvchahp的专栏 456

Linux误删文件恢复实战:extundelete原理与避坑指南

在Linux运维中,rm -rf误删文件是常见高危操作,其底层基于unlink机制,仅解除inode链接而不立即擦除数据块,为恢复提供了可能。extundelete等工具通过扫描inode表与日志,重建被删文件,技术价值在于无需备份即可抢救数据。典型应用场景包括生产环境数据盘误删、备份失效等紧急情况。恢复成功率取决于是否及时只读挂载、停止写入,并选择合适工具。本文结合真实事故,详解ext4删除机制、extundelete实操与常见问题排查,助你掌握底层恢复核心技能。

weixin_34221276的博客 377

《c程序设计语言》读书笔记-4.2-扩充atof函数

#include #include #include #include #include #include double atof_num(char s[]) { double val,power = 1.0; int i,sign,j,val_lat = 0; for(i = 0; isspace(s[i]); i++) ; sig

lvchahp的专栏 559

《c程序设计语言》读书笔记-4.14-定义宏交换两个参数

#include #include #include #include #define swap(t,x,y) { t _z;\ _z = y;\ y = x;\ x = _z; } int main() { int

lvchahp的专栏 524
上一篇: C程序设计语言读书笔记(3)
下一篇: C程序设计语言读书笔记(5)
I_code
博客等级 码龄16年 42粉丝 36原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值