2020-08-05 笔试05 浙江奇赛其自动化科技 嵌入式软件 笔试题目

这篇博客讨论了C/C++中防止头文件重复包含的#ifndef、#define、#endif宏和#pragma方法,分析了各自的优缺点。同时深入介绍了const关键字的作用,包括类型检查、保护变量、提高代码效率等方面,并探讨了在全局变量和函数调用中的使用策略。最后提到了在C++中调用C编译的函数需extern "C"的原因。
摘要由CSDN通过智能技术生成

答:防止头文件被重复包含;

附:https://www.cnblogs.com/Miranda-lym/p/5187606.html

#ifndef,#define,#endif是C/C++语言中的宏定义,通过宏定义避免文件多次编译。所以在所有支持C++语言的编译器上都是有效的,移植性好,所以如果写的程序要跨平台,最好使用这种方式。但缺点是宏名字不能冲突。

#pragma 可以避免名字冲突,缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。且不是所有编译器都支持这种方式。

 

答: 对于#include  <filename.h> ,编译器从标准库路径开始搜索 filename.h

     对于#include  “filename.h” ,编译器从用户的工作路径开始搜索 filename.h

 

 

博主一:

const是constant的简写,只要一个变量前面用const来修饰,就意味着该变量里的数据可以被访问,不能被修改。也就是说const意味着“只读”readonly。基本数据类型对const透明

规则:const离谁近,谁就不能被修改;

const修饰一个变量,一定要给这个变量初始化值,若不初始化,后面就无法初始化。

本质:const在谁后面谁就不可以修改,const在最前面则将其后移一位,二者等效。

 

const关键字作用:

  1. 为给读你代码的人传达非常有用的信息,声明一个参数为常量是为了告诉用户这个参数的应用目的;
  2. 通过给优化器一些附加信息,使关键字const也许能产生更紧凑的代码;
  3. 合理使用关键字const可以使编译器很自然的保护那些不希望被修改的参数,防止无意的代码修改,可以减少bug的出现;

 

const关键字应用

  1. 欲阻止一个变量被改变,可使用const,在定义该const变量时,需先初始化,以后就没有机会改变他了;
  2. 对指针而言,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;
  3. 在一个函数声明中,const可以修饰形参表明他是一个输入参数,在函数内部不可以改变其值;
  4. 对于类的成员函数,有时候必须指定其为const类型,表明其是一个常函数,不能修改类的成员变量;
  5. 对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。

 

博主二:

 

与预处理指令相比,const修饰符的优点:

  1. 预编译指令只是对值进行简单的替换,不能进行类型检查
  2. 可以保护被修饰的东西,防止意外修改,增强程序的健壮性
  3. 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

(C语言中const常量是会分配内存空间的,保存在符号表中的是C++中到的const常量)

 

对于全局变量,可以在.c文件里面定义,在.h里面声明,如果放在.h中定义,那么可能会出现重复定义的错误。

 

原则一:一般只在头文件中做声明!!若是全局变量,可以在头文件声明,在源文件定义

原则二:一般定义static全局变量时,都把它放在源文件中而不是头文件,这样就不会给其他模块造成不必要的信息污染。如果放在头文件中,头文件被多出引用,其实是多份不同的内存

 

 

4.在C++程序中调用被C编译器编译后的函数,为什么要加extern C?

答:函数变量被C++编译后在符号库中的名字与C不同,被extern “C”修饰的变量是按照C语言的编译方式编译和链接的。由于编译后的名字不同,C++程序不能直接调用C函数,C++提供了一个C连接交换指定符号extern “C”解决这个问题。

 

 

答:https://www.cnblogs.com/jason-linux/p/10603471.html

第一个

1)优点:程序简洁

条件判断出现在For里面,意味着,即使我在dosomething()或dootherthing()这2个函数中改变了condition的值,For循环也能正确执行我的意图,因为它在每次循环中都会重新检测conditon的值并针对condition的值做不同动作,所谓以不变应万变,这是难能可贵的.  

2)缺点:多执行了N-1次逻辑判断,并且打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。如果condition一直未曾改变,我们可怜的if必须每次循环都判断一下condition的真假.牺牲了运行时效率.

第二个

1)优点:循环的效率高。只进行一次判断,运行时效率高.适合那种condition的值不会改变的情况.

2)缺点:由于只在一开始进行一次判断,所以失去的改变condition的值的机会,也就是说,即使我在dosomething()中改变了condition的值为false,这个程序也不会改变它的判断,它依然执行着dosomething()的循环.我们不能随时更换我们需要进行的动作。这是牺牲了弹性。

 

N较大时,建议采用后面这种写法,由于前者老要进行逻辑判断,打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。

 

 

https://blog.csdn.net/u010648606/article/details/26068163

答:

(1)If(flag)                        if(!flag)

(2)const float EPSINON = 0.00001;

if ((x >= - EPSINON) && (x <= EPSINON)

注意: 不可将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”此类形式!!

(3)if (NULL == p)             if (NULL != p)

注意:特别注意在int ,指针型变量和“零值”比较的时候,把“零值”放在左边,这样当把“==”误写成“=”时,编译器可以报错,否则这种逻辑错误不容易被发现,并且可能导致严重后果。

C语言的常见段错误:

  1. 非关联化指针
  2. 试图访问不存在的内存地址
  3. 试图访问内存的程序没有权利
  4. 试图写入只读存储器

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值