C编程的细节(3)

来源:互联网 发布:淘宝刷手有什么风险么 编辑:程序博客网 时间:2024/06/11 08:18

1.函数的传参是从左到右传的,如printf均是从左到右接收值的,所以其中包含的一些值得修改的表达式的位置就很有必要了。

例: int i=0;   printf("%d ,%d",i,++i);其打印的值为:1 ,1。

2.数组的标识符是不能进行自增自减运算的,即使表示地址的指针可以和整型数值相加减,因为其不是作为左值使用的。例如数组:int arr[10];其表示地址的指针的类型是(int *const  arr),该指针只能解引用,不能赋值运算。

3.数据类型即使进行强制转换,其内部存储的形式不变。强制转换类型是操作符。(强制转换类型是在编译之时确定的还是在函数执行之时确定的),例如浮点型强制转化为整型,是调用函数进行转化的,执行函数则是进程中。

4.bool类型的存储大小是1byte。在判断语句中,按照其运算规则进行运算,将最后所得的值进行布尔比较,如果为0则为假,否则真。在此特别注意无符号整形与有符号数运算结果为无符号数,而有符号数若是按无符号数进行解释,则结果会有偏差。

5.在C代码中,有一些操作会在预处理时就做出,有些会在编译器中完成。

如预处理中会完成有:宏定义的替换;

编译优化中会完成的有:sizeof类型的判定替换。一些简单的常量计算,还有一些简单的取反操作,const定义的变量;

例如:-(-10)会在编译中优化为10,而int i=0;   -(-i)不会进行优化,会在CPU中一步步指行。

i=30+20;会在编译中优化为40;

 i=30+20;此表达式的汇编代码如下:

003E1405 C7 45 F8 32 00 00 00 mov         dword ptr [i],32h         

一些操作在编译成可执行程序之前进行处理,可减少以后程序运行时CPU的运行的步骤,提高效率。

6.有符号的整型与无符号整形进行运算,其结果为无符号类型。

7.变量有四种类型:整型,浮点,指针,自定义结构体。字符型属于整型类型。

8.整型之间的赋值:

大类型数据赋值给小类型数据要发生截断,小类型数据赋值给大类型数据要补位。

大类型数据赋值给小类型时,若其值在小类型的取值范围值中,则正常赋值补位,若不再取值范围中会发生截断,所赋的值发生改变。小类型赋值给大类型数据是要考虑其符号,是有符号还是无符号,补位是要补0还是要补1。无符号是低位复制,高位补零。有符号时低位复制,高位当其为正数补0,当其为负数则补1。

9.浮点数之间的赋值:

大类型向小类型赋值,若大类型的值在小类型的范围中,可赋值但不精确。小类型可以向大类型赋值可赋值不精确。

大类型向小类型赋值,若不在其范围内则会发生丢失数值,显示警告但不终止。

若给浮点数赋值一个超出其范围的数值,则会发生常量算法中溢出,显示警告并终止。

浮点数之间赋值不精确,浮点数赋值常数也不精确。


0 0
原创粉丝点击