C和指针 第五章 警告总结

 1.有符号的值得右移位操作是不可移植的

 2.移位操作的位数是个负数,是未定义的

 3.连续赋值的各个变量的长度 不一,导致变量值截断。

#include <stdio.h>

int main()
{
	char chr_num;
	int  int_num;
     //截断
	int_num = chr_num = 100000;

	return 0;
}

  编译器提示:

  

   4.条件语句勿用=代替==

   5.勿用 | 代替||, & 代替 &&

   6.不同的用于表示布尔值非零值之间进行比较。

  

#define FALSE  0
#define TRUE   1

//如果flag为任意整型值,那么下面两个语句是不等价的
if(flag == TRUE)
{
}

if(flag)
{
}

  避免混合使用整型值和布尔值

  7.表达式赋值的位置并不决定表达式的计算精度。

  如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数转换为另外一个操作数的类型,否则操作数无法进行。

  

寻常算术转换
long double
double 
float 
unsigned long int
long int
unsigned int
int

  如果某个操作数排名较低,那么它首先转换为另外一个操作数的类型,然后执行操作。

例如 在16位的机器上

int a = 5000;
int b = 100;
long c = a * b;

会发生溢出,需要将a * b的结果转换为长整型。

int a = 5000;
int b = 100;
long c = (long) a * b;

  8.编写结果依赖于求值顺序的表达式

  表达式的求值顺序由三个因素影响:

  操作符的优先级

  操作符的结合性

  操作符是否控制执行顺序

  操作符的优先级决定了相邻的操作符哪个先被执行,如果优先级相等,那么结合性决定执行顺序,

  但是,这些并不能完全决定表达式的求值顺序,编译器只要不违背优先级和结合性规则,可以自由决定复杂表达式的求值顺序。所以如果,表达式的结果依赖于求值顺序,那么,本质上是不可移植的,避免使用。

posted @ 2016-08-14 13:38  xnuwu  阅读(183)  评论(0编辑  收藏  举报