C/C学习笔记/函数与程序结构

C学习笔记

——函数与程序结构

一、函数定义形式

<strong><span style="color:#cc66cc;">返回值类型<span style="white-space:pre">	</span>函数名(参数声明表) 
{ 
<span style="white-space:pre">	</span>声明和语句
} </span></strong>

函数定义不能位于另一个函数体内。 

如果函数定义中省略了 “返回值类型”,则默认为 int 型。 

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

<strong><span style="color:#cc66cc;">return <span style="white-space:pre">	</span>表达式; </span></strong>

必要时,表达式将被转换为函数的返回值类型。表达式两边的括号可选。表达式也是可选的(此时,不会返回值,只会返回控制权)。 

如果函数带有参数,要声明他们;如果没有,用void。 


题外话:逆波兰表示法 所有运算符都跟在操作数后面 如:( 1-2 ) * (4 +5) 表示为:1 2 - 4 5 + * 

二、作用域规则

名字的作用域指的是程序中可以使用该名字的部分
不同函数中声明的具有相同名字的各个局部变量之间没有任何关系。( 全局变量和局部变量最好不要同名;自动变量(包括形参)可以隐藏同名的外部变量与函数。变量的识别是靠地址实现的

外部变量或函数的作用域从 声明它的地方开始,到 其所在的(待编译)文件的末尾结束。 所有源文件(.c)中,一个外部变量只能在某个文件中 定义一次,而其他文件可以通过extern声明来访问它。

外部数组变量的定义中 必须指定数组的 长度,但 extern声明则不一定需要

外部变量的 初始化必须出现 在其定义中。(注:初始化和赋值的区别!)

三、头文件

考虑定义和声明在源文件之间的共享问题,尽可能把共享的部分集中在一起,这样就只需要一个副本,改进程序时也容易保证程序的正确性。——《C程序语言设计》


四、静态变量static

作用:
  • 限定存储方式(局部变量)
    与局部变量不同之处在于,利用static限定之后,(在程序运行过程中)其在内存中一直占据着存储空间,不会释放
  • 限定作用域(全局变量)
    通常情况下,外部变量和函数对整个程序的各个部分可见(对不非其所在源文件的其他文件,可用extern访问)。
    用 static 限定外部变量与函数,可以将其后声明的对象的作用域限定为被编译源文件的剩余部分。可以达到隐藏外部对象的目的。(extern与static不能同时存在,可以尝试 extern static int a是否报错

五、寄存器变量register

register声明告诉编译器,该变量在 程序中使用频率较高
该变量放在 机器的寄存器中,使程序更小、更快。
无论寄存器变量实际上是不是存放在寄存器中,地址均不可访问

六、初始化(变量定义、声明、赋值、初始化)

变量定义性声明<span style="white-space:pre">	</span>:<span style="white-space:pre">		</span>int<span style="white-space:pre">	</span>a;
变量引用性声明<span style="white-space:pre">	</span>:extern<span style="white-space:pre">	</span>int<span style="white-space:pre">	</span>a;
变量赋值 :<span style="white-space:pre">				</span>a = 7;
变量初始化 : <span style="white-space:pre">			</span>int <span style="white-space:pre">	</span>a =<span style="white-space:pre">	</span>7;

初始化 = 变量定义 + 赋值

对于未显式初始化的 外部变量静态变量 ,都将被“自动”初始化为 
对于未显式初始化的 局部变量寄存器变量 ,不会“自动”初始化;

初始化必须使用常量表达式

七、C预处理器(最常用:include/define)

预处理器是编译过程中单独执行的第一个步骤。
7.1 文件包含指令 include
处理大量的define和声明更加方便。

  • <strong><span style="color:#cc66cc;">#include<span style="white-space: pre;">	</span>“文件名.h”</span></strong>
    先在源文件所在位置查找该文件;若未找到,则按固定规则查找。
  • <strong><span style="color: rgb(204, 102, 204);">#include<span>	</span><文件名.h></span></strong>
    按固定规则查找(该规则与具体实现有关)
#include语句行 都将 被替换为文件名 指定的文件的内容。( 相当于  #define文件名 文件内容
7.2宏替换 define
最简单的宏替换:
<strong><span style="color:#cc66cc;">#define名字 替换文本</span></strong>
该语句后续所有出现 名字 记号的地方都将被替换为 替换文本
也可以将长替换文本分成若干行,中间利用“ 反斜杠符 \ ”连接。 如果替换文本中有空格,请注意使用括号,否则会出现一些错误
例:#define<span style="white-space:pre">	</span>A<span style="white-space:pre">	</span>ABCDEFGH\ 
<span style="white-space:pre">			</span>IJKMNOPQ\ 
<span style="white-space:pre">			</span>RSTUVWX\ 
<span style="white-space:pre">			</span>YZ
替换只针对记号进行,对括在引号中的字符串不起作用

带参宏定义
例:<span style="white-space:pre">	</span>#define<span style="white-space:pre">	</span>max(A,B) ( ( A ) > ( B )  ?  A  :  B )
调用时:max( p + q, r + s )<span style="white-space:pre">	</span>= (  ( p + q ) > ( r + s ) ? ( p + q ) : ( r + s )  )
注意:该种调用时,作为参数的表达式要重复计算两次。如果是有”自增/自减“运算符的话更加明显
例:max( i++ , j++ );
注意:另在替换文本中的“括号”必须使用恰当!!
例:#define<span style="white-space:pre">	</span>plus(A,B)<span style="white-space:pre">	</span>A + B
<span style="white-space:pre">		</span>plus(1,2) * plus(3,4) = 1 + 2 * 3 + 4(可以想见不是想要的结果)
可以使用 #undef 指令 取消名字的宏定义

形参 不能用 带引号的字符串 替换。但在 替换文本中,参数名以   #  作为  前缀 则结果将被扩展为由 实参 替换 该参数的带引号 的 字符串。
例:<span style="white-space:pre">	</span>#define<span style="white-space:pre">	</span>dprint(expr)<span style="white-space:pre">	</span>printf(#expr " = %g\n ", expr)
调用时:dprint(x/y)= printf("x/y"  " = %g\n ", x/y)= printf("x/y = %g\n", x/y) ;
在实参中,每个 双引号" 都将被替换为 \"反斜杠\ 被替换为\\

可以使用 ## 连接两个参数:
#definepaste(front, back)<span style="white-space:pre">	</span>front##back(可以存在空格)
调用时:inti = paste(1,2) = 12; 
7.3 条件包含
#if <span style="white-space:pre">	</span>常量表达式
#elif<span style="white-space:pre">	</span>常量表达式
#else
....
#endif
同if...else的用法,只不过最后必须使用#endif结尾。

除了#if,还有#ifdef,#ifndef,用于测试某个名字(函数名,变量名,头文件等)是否已经定义。对头文件而言,即确认该头文件是否已经被包含过。










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值