2021-08-24 自学C语言《跨平台的C语言程序设计》(上海工程技术大学SUES校本) 第十一章 宏定义与文件包含 总结+课后练习

选择题4错误点

Define 不能写return 完全替换之后int main就有两个return.

选择题5错误点

a/=SQR(k+m)/SQR(k+m)  SQR(k+m)/SQR(k+m)=2+1*2+1/2+1*2+1=7.5  a=a/Ans=16/7.5=2(Int)

选择题6错误点

后缀++表示执行完该行语句后再自加,前缀++表示立即执行自加,然后执行该行语句。所以输出6和8.

所以带参宏定义和函数的区别是这八个:1.宏会在编译器在对源代码进行编译的时候进行简单替换,不会进行任何逻辑检测,即简单代码复制而已。
2.宏进行定义时不会考虑参数的类型。
3.参数宏的使用会使具有同一作用的代码块在目标文件中存在多个副本,即会增长目标文件的大小。
4.参数宏的运行速度会比函数快,因为不需要参数压栈/出栈操作。
5.参数宏在定义时要多加小心,多加括号。 
6.函数只在目标文件中存在一处,比较节省程序空间。
7.函数的调用会牵扯到参数的传递,压栈/出栈操作,速度相对较慢。
8.函数的参数存在传值和传地址(指针)的问题,参数宏不存在。

1.文件包含srand会设置供rand()使用的随机数种子

X=x*pow(-1,rand())    (-1)的随机次幂

2.条件编译的三种形式

#ifdef标识符

程序段1

#else

程序段2

# endif

#ifndef 标识符

  程序段1

#ese

     程序段2

#endif

其功能是: 如果标识符未被#define命令定义过则对程序段1进行编译,否则对程序段2进行编译。这与第一种形式的功能正好相反。

第三种形式

#if 常量表达式

  程序段1

#else

程序段2

#endif

源文件目录 一般只放C文件.
包含文件目录 一般只放h文件.
不过 这个只是约定.
实际上 在源文件目录放h文件,或者在包含文件目录放C文件也都是可以的不过看起来会不专业.

 includeC语言中的预处理指令,用于包含头文件(.h扩展名)。使用方法有两种,

#include <xxx.h>#include "xxx.h"

使用include包含了一个头文件后,该头文件将在预处理阶段全文被复制到当前程序文件中。

两者区别主要是查找头文件的路径,<>在系统目录中查找,""先在当前目录中查找然后在系统目录中查找。

#define 和 #undef,分别用于定义和取消定义条件编译符号。

#if、#elif、#else 和 #endif,用于按条件跳过源代码中的节。

#line,用于控制行号(在发布错误和警告信息时使用)。

#error 和 #warning,分别用于发出错误和警告。

#region 和 #endregion,用于显式标记源代码中的节。

预处理指令总是占用源代码中的单独一行,并且总是以 # 字符和预处理指令名称开头。# 字符的前面以及 # 字符与指令名称之间可以出现空白符。

包含 #define、#undef、#if、#elif、#else、#endif 或 #line 指令的源代码行可以用单行注释结束。在包含预处理指令的源行上不允许使用带分隔符的注释(/* */ 样式的注释)。

预处理指令既不是标记,也不是 C# 句法文法的组成部分。但是,可以用预处理指令包含或排除标记序列,并且可以以这种方式影响 C# 程序的含义。

Void的作用void代表无类型,常用在程序编写中对定义函数的参数类型、返回值、函数中指针类型进行声明。在函数体前面写代表这个函数的返回值为空,就是不需要返回值。如果函数没有返回值,那么应声明为void类型。在C语言中,凡不加返回值类型限定的函数,就会被编译器作为返回整型值处理。void几乎只有注释和限制程序的作用,void真正发挥的作用在于对函数返回的限定和对函数参数的限定。通常我们希望通过函数调用使主调函数能得到一个确定的值,这就是函数的返回值。函数的返回值是通过函数中的 return 语句获得的。return 语句将被调函数中的一个确定的值带回到主调函数中,供主调函数使用。

函数的返回值类型是在定义函数时指定的。return 语句中表达式的类型应与定义函数时指定的返回值类型一致。如果不一致,则以函数定义时的返回值类型为准,对 return 语句中表达式的类型自动进行转换,然后再将它返回给主调函数使用。但是建议初学者在编程的时候,务必要保持它们两个类型一致。

在调用函数时,如果需要从被调函数返回一个值供主调函数使用,那么返回值类型必须定义成非 void 型。此时被调函数中必须包含 return 语句,而且 return 后面必须要有返回值,否则就是语法错误。

如果函数有返回值,那么 return 语句后面的括号可以不要,比如“returnz);等价于“return z。若不需要返回值则可以不要 return 语句。

需要强调的是,一个函数中可以有多个 return 语句,但并不是所有的 return 语句都起作用。执行到哪个 return 语句,就是哪个 return 语句起作用,该 return 语句后的其他语句就都不会执行了。

return是如何将值返回给主调函数的

我们知道,被调函数运行结束后才会返回主调函数,但是被调函数运行结束后系统为被调函数中的局部变量分配的内存空间就会被释放。也就是说,return 返回的那个值在被调函数运行一结束就被释放掉了,那么它是怎么返回给主调函数的呢?

事实上在执行 return 语句时系统是在内部自动创建了一个临时变量,然后将 return 要返回的那个值赋给这个临时变量。所以当被调函数运行结束后 return 后面的返回值真的就被释放掉了,最后是通过这个临时变量将值返回给主调函数的。而且定义函数时指定的返回值类型实际上指定的就是这个临时变量的类型。这些都是系统自动完成的,了解即可。

这也是为什么当 return 语句中表达式的类型和函数返回值类型不一致时,将 return 的类型转换成函数返回值类型的原因。return 语句实际上就是将其后的值赋给临时变量,所以它要以临时变量的类型为准,即函数返回值的类型。

宏定义的三种形式不能忘了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值