1根据位模式构筑图形:
c语言建立位图可以利用宏定义的技巧。书中举了这样一个例子:
想定义一个秒表的位图,采用了宏定义的方法:
而不是这样苦苦的计算:
宏定义中,各项相加后就等于下图的值,但上图更具直观性,而且不用计算,十分好设计。
当然,记得完成后取消宏定义 #undef,否则后面的代码可能会有问题。
2在等待时类型发生了变化:(隐式类型提升)
ANSI C中延续了自动类型提升的概念。
类型转换
整形提升:要求抽象机器把每个变量的值提升为int长度,然后对两个int值执行加法运算,然后再对运算结果进行裁剪。如果两个char的加法运算结果不会发生溢出异常,那么在实际执行时只需要产生char类型的运算结果,可以省略类型提升。
整型提升就是char short int和位段类型(无论signed或unsigned)以及枚举类型将被提升为int,前提是int能够完整的容纳原先的数据,否则将被转换为unsigned int。ANSI C表示如果编译器能够保证运算结果一致,可以省略类型提升——这通常出现在表达式中存在常量操作数的时候。
float提升为double
参数也会被提升!在ANSI C中如果使用了适当的函数原型,类型提升便不会发生,否则也会发生。在被调用的函数内部,提升后的参数被裁减为原先声明的大小。
printf格式化字符串%d能适用几个不同类型,这是因为函数从堆栈中或寄存器中取出的参数总是int类型。除非用lu作参数。
c语言的类型转换远比其他语言常见。其他语言往往将类型转换只用于操作数上,使操作数两端数据类型一致。c语言除了完成这项任务外,还提升比规范类型int或double小的数据类型。
(建议看书上的例子,并实操)
3原型之痛
目的:是使c语言成为一种更加可靠的语言。但原型引入了一种微妙的语义区别。如果使用了函数原型,缺省参数提升就不会发生。如果参数声明为char,则实际所传递的也是char。
在实际编程中,我们通过把函数原型放置在头文件中,而函数的定义则放置在另一个包含了该头文件的源文件中来防止不匹配的情况发生。这样编译器能同时发现他们,如有不匹配就能检测到。
4如何进行强制类型转换,为何要进行类型强制转换
(float)3是一个类型转换,而且数据的实际二进制位发生了改变。
(float)3.0则用于消除类型歧义。
复杂类型转换的步骤:
1一个对象的声明,它的类型就是想要转换的结果类型。
2删去标识符(以及任何如extern之类的存储限定符),并把剩余的内容放在一对括号里。
3把第2步产生的内容放在需要进行类型转换的对象的左边。
5const的用法
在C语言中,单独定义 const 变量没有明显的优势,完全可以使用#define命令代替。const 通常用在函数形参中,如果形参是一个指针,为了防止在函数内部修改指针指向的数据,就可以用 const 来限制。
在C语言标准库中,有很多函数的形参都被 const 限制了,下面是部分函数的原型:
size_t strlen ( const char * str );
int strcmp ( const char * str1, const char * str2 );
char * strcat ( char * destination, const char * source );
char * strcpy ( char * destination, const char * source );
int system (const char* command);
int puts ( const char * str );
int printf ( const char * format, ... );
如果有想学习编程的初学者,可来我们的C/C++技术学习扣qun的哦:58,934,83-89里面免费送整套系统的C/C++教程!
网友评论