【1】用#define声明一个常数,用以表明一年中有多少秒
#define SECONDS_PER_YEAR (60*60*24*365)UL
阐明:首要,结尾#define语法结尾不能有分号;
其次,计算式最好带括号;
第三,这个表达式会使16位机的整型数溢出,因而需求用长整型符号L告知编译器这个常数是长整型数,结尾用UL(无符号长整型)。
【2】用C编写死循环
第一种计划:while(1){}
第二种计划:for(;;){}
第三种计划:Loop:
goto Loop; //这种计划是用汇编写的
【3】拜访特定内存方位:
在某工程中,一个整型变量的肯定地址是0x67a9,请将其设置为0xaa55,而且已知编译器是一个朴实的ANSI编译器,请编写代码
int* ptr;
ptr=(int*)0x67a9;
*ptr=0xaa55;
【4】对中止服务代码的谈论
以上程序有如下几个过错:
1、ISR不能回来一个值;
2、ISR不能传递参数,即不能有形参;
3、在许多处理器或编译器中,浮点数一般是不行重入的。有些处理器或编译器需求运用额定的寄存器入栈,有些处理器或编译器是不允许在ISR中做浮点运算。此外,ISR应该是短而有功率的,在ISR中做浮点运算是不明智的;
4、printf()经常出现重入和性能上的问题,
【5】对整数主动转化准则的了解
C语言中,整数主动转化准则是:当表达式中一起存在有符号和无符号类型时,一切的操作数都主动转化成无符号类型。因而,上面程序中,第5行,a+b,a是无符号整型,b是有符号整型,二者相加,则b主动转化成无符号整型,-20变成了一个非常大的正整数,那么明显,此刻a+b》6是建立的,因而,上面程序终究输出的结果是“》6”。
【6】关键字staTIc的效果
1、在函数体内,部分的staTI变量。效果域在函数体内,生存期却为程序的生命周期。一个被声明为静态的变量在这一函数被调用过程中保持其值不变,即本次拜访该变量时拜访到的是前次调用后的值。由于它被分配在静态存储区内,函数完毕调用后并不开释单元,可是在其它的效果域无法拜访。当再次拜访这个函数时,这个部分的静态变量还存活,因而拜访到的是前次调用后的值。
2、在文件模块内(但在函数体外),一个被声明为静态的大局变量,能够被模块内一切函数拜访,但不能被模块外其它函数拜访。它是一个本地的大局变量。
3、在文件模块内,一个被声明为静态的函数只能够被这个模块内的其它函数调用。即这个函数被约束在声明它的本地范围内。
【7】与大局目标比较,运用静态数据成员有什么优势
1、静态数据成员没有进入程序的大局姓名空间,因而不存在与程序中其它大局姓名抵触的问题。
2、运用静态数据成员能够躲藏信息,由于静态数据成员能够是private成员,而大局变量不能。
【8】关键字volaTIle的意义
界说为volaTIle的变量或许会被意想不到地改动,这样编译器就不会去假定这个变量的值。精确地说,优化器在用到volatile变量时有必要小心肠从头读取该变量的值,而不是运用保存在寄存器里的备份。运用volatile变量的当地如:
1、并行设备的硬件寄存器(如:状况寄存器)。
2、一个中止服务子程序中会拜访到的非主动变量。
3、多线程运用中被几个使命同享的变量。
【9】判别处理器运用Big_endian仍是Little_endian形式存储数据
编写一个函数,若处理器运用Big_endian形式存数数据,则回来0;若是用Little_endian形式存储数据,则回来1。
剖析:首要,应该了解Little_endian和Big_endian形式有所了解,选用Little_endian形式的CPU对操作数的存储方法是从低字节到高字节,而Big_endian形式对操作数的存储方法是从高字节到低字节。
例如,16位数0x1234在Little_endian形式CPU内存中的寄存方法(假定从地址0x4000开端寄存)为:
0x4000: 0x34
0x4001: 0x12
而在Big_endian形式CPU内存中的寄存方法为:
0x4000: 0x12
0x4001: 0x34
32位宽的数0x12345678在Little_endian形式CPU内存中的寄存方法为:
0x4000: 0x78
0x4001: 0x56
0x4002: 0x34
0x4003: 0x12
而在Big_endian形式CPU内存中存储方法为:
0x4000: 0x12
0x4001: 0x34
0x4002: 0x56
0x4003: 0x78
该函数为:
在联合体中界说了两个成员int和char,而联合体的巨细=sizeof(int)=4,因而该联合体在内存中占4个字节的巨细,假定占用的内存地址为:0x1000~0x1003,那么当给a赋值1时,假如按Little_endian方法寄存该数据,则:
0x1000: 0x01
0x1001: 0x00
0x1002: 0x00
0x1003: 0x00
那么这个数值1应该寄存于地址0x1000中
而联合体有一个特性:成员都从低地址开端寄存,所以当c.b=1时,那就证明数值1是存储于地址0x1000中的,那么久能够证明是Little_endian方法存储。
假如按Big_endian方法寄存a的数值1,则
0x1000: 0x00
0x1001: 0x00
0x1002: 0x00
0x1003: 0x01
由联合体的特性可知,当以Big_endian方法存储的时分,c.b=0
【10】判别处理器字长
unsigned int CompareZero=~0
cout《《hex《《CompareZero《《endl;
【11】找错(对静态成员与非静态成员的了解)
上面程序中,i为静态成员变量,func2()为静态成员函数
第9行,test(int a):i(1),j(a) {} 根据规定,初始化列表的初始化次序 应该与 变量声明的次序共同,而不是依照出现在初始化列表中的次序,从第7、8行能够看到,变量声明次序先是i,然后再j,那么在第9行中,也应该先初始化i,再初始化j,那么此刻应该i=1,j=a=2,这样看似没有错,可是,疏忽了一个细节,i是静态成员变量。
为了与非静态成员变量相差异,i是不能再类的内部被初始化的。
能够在类的外部进行初始化,如,先把第9行改为,test(int a):j(a) {}
然后再在第13行,增加:int test::i=1;
第16行,界说func2函数,首要该函数为静态成员函数,它想拜访静态成员变量i,以及一般变量j,可是静态成员函数只能拜访静态成员变量,并不能拜访非静态成员,因而无法拜访j,此行应该改为:
void test::func2() {cout《《i《《endl;}
需求留意的是:
1、静态数据成员有必要在类外面初始化,以示与一般数据成员的差异。
2、静态数据成员以及静态函数成员,不属于类的目标,因而没有this指针,也就无法调用类的非静态成员,它是为类的一切的目标所同享。