C语言宏定义为什么结果是35(详情见图片)?

        我们在 C 语言中经常会用到宏定义,那么我们今天就对宏做个简单的介绍。#define 是预处理期处理的单元实体之一;它定义的宏可以出现在程序的任意位置;它定义之后的代码都可以使用这个宏。

        #define 定义的宏常量可以直接使用,其本质为字面量。它与 const 定义的常量的区别是:const 修饰的常量本质是变量,占用内存;而字面量是不占用内存的。我们来看看下面这几个宏常量定义是否正确

        我们分析下,前两个肯定正确,第三种猜测是正确的,因为宏定义只是简单的替换。第四种也是正确的,最后的 \ 我们看成是前面介绍的接续符。我们来单步编译下,看看结果

        我们看到编译出错了,因为宏只是被预处理期处理,预处理期不会去检查语法,所以会单步编译通过。所以在编译检查语法的时候出错了。我们下来看个示例代码,代码如下

        我们分析,第14行返回相加和,因而第19行打印 3;第15行返回加和的平方,因而第20行打印 9;第16行返回最小值,因而第21行打印 1;第17行返回的是数组的个数,所以第22行打印 4。我们看看编译结果

        我们看到它的 main 函数是这样的,因而我们分析的是错的。那么在这块我们是忽略了宏表达式和函数的差异,那么宏表达式有哪些特性呢?如下:a> 宏表达式被预处理器处理,编译器不知道宏表达式的存在;b> 宏表达式用“实参”完全代替形参,不进行任何运算;c>

        它并没有报错,而是成功运行。在这里我们注释掉头文件和打印语句,我们来单步编译下,看看函数里是怎样的?

        我们在第4行定义 MALLOC 为申请堆空间并用指针来存储地址,第6行利用之前学习的逗号表达式来释放申请到的指针。第8行则是利用内置宏定义 LOG 打印信息,第10-12行分别定义 for 循环和{ }。我们来看看编译后打印的结果

语言中是利用函数办不到来打印文件名和行数信息的。通过对宏定义的学习,总结如下:1、预处理期直接对宏进行文本替换,宏使用时的参数不会进行求值和运算;2、预处理期不会对宏定义进行语法检查,宏定义出现的缘分错误只能被编译器检测;3、宏定义的效率高于函数调用但会带来一定的副作用。后面我们会继续对 C 语言的学习。

这个问题比较复杂,因为往往写出这样语句的都是资深人才,我们从使用者的角度判断一下是什么意思就可以,还有就是为什么需要这么写

明面意思就是把一个var 不知道什么类型的一个什么东西,首先就是取它的地址 &(var)

然后没有了,最终的目标就是把一个var变量,取得它的地址并且按byte格式序列化,取它的相对首地址

这个问题比较关键的是这个(void*)转换是否为必须的,在一个特定的平台上,我个人觉得不是很必须,但是想要安全性好,还是建议写宏给别人用的时候,加上再说,

也就是说 从一个不知道具体什么格式的变量的地址 直接转换成byte*

不如先转换成void 然后再转换成byte* 比较好,这个理解就行

字面上 理解就是给port寄存器 赋值,然后为什么这么写简单说下:

按照某种情况,应该是首先设置硬件寄存器port=0x00;然后读取硬件寄存器port然后把读取出来的值^0xff;然后再将这个值写会port和temp_data;

万一编译器够“聪明”,优化成了 port = 0x00; port=0xff; temp_data = 0xff; 意思就错了,因为从port读取出来的值是由硬件决定的所以设计硬件寄存器的声明要加volatile 是给编译器看的,防止过度优化代码

然后将这个byte数据 写入到port寄存器

3.全局变量可不可以定义在被多个.C文件包含的头文件中?为什么?

答:可以,在不同的C文件中使用“static”形式来声明同名全局变量。也可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件对全局变量赋值,此时连接不会报错。

4.for(;1;)有什么问题?它是什么意思?

答:和while(1)相同。永真循环(死循环)。

答:do......while()是直到型循环结构,要先执行循环体一遍,在进行判断。while()当型循环结构,要先进行判断,再执行循环体。

6.static全局变量与普通变量有什么区别?static局部变量与普通局部变量有什么区别?static函数与普通函数有什么区别?

答:static全局变量只初使化一次,防止在其他文件单元中被引用。

static局部变量只被初始化一次,下一次依据上一次结果值。

static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。

注意:全局变量本身就是静态存储方式,静态全局变量也是静态存储方式,这两者在存储方式上并无不同。这两者的区别在于非静态的全局变量的作用域是整个源程序,当一个源程序由多个源文件组成的时候,非静态的全局变量在每个文件中都是有效的,而静态的全局变量则限制了它的作用域,即只在定义该静态全局变量的源文件中有效,在同一源文件的其他源程序中不能使用。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式,即改变了它的生存期。把全局变量改变为静态变量后,即改变了它的作用域,限制了它的使用范围。

static函数与普通函数作用域不同,只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件,要包含这个函数的头文件。

程序的局部变量存在于(堆栈)中,全局变量存在于(静态区)中,动态申请数据存在于(堆)中。

7.队列和栈有什么区别?

9. 在C语言库函数中将一个字符转换成整型的函数是atol()吗,这个函数的原型是什么?

atoi()函数是将字符转化成整型数int。

atof()函数是将字符转化成双精度型(double)。

atol()是将字符转化成长整型long型

10. 对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?

我要回帖

更多关于 c语言宏定义用法 的文章

 

随机推荐