1、if(!flag),相当于“当flag等于0时”
因为,括号中为真时,即非零,时才执行if分支。那么前面加了“!”表示“非”,那么只有flag为零时,“!flag”才是真
2、位运算符~0,表示的是把所有的位都置为1
因为,这里的“0”是个十进制的写法,那么它是int型的,用二进制表示就是(32位机中)0000 0000 0000 0000
0000 0000 0000 0000,将他们取反,就是全部变成了1
注意:在位运算中的算法,取多少个位什么的,总是把这个些位向右移动到最后再进行处理
3、在scanf("%x", a);
在执行时输入0xaa,与输入aa是一样执行的
4、利用printf("%s{%s}[%d]:\n", __FILE__, __FUNCTION__,
__LINE__);做测试的时候用
5、关于char与int
这其实是个字符与数值之间的转化的一个问题,通常我们说char型是小整型。如下看个例子
eg:int a = 0;
char b = '0';
printf("%d,%d\n", a,
b);
printf("%c,%c\n", a,
b);
以上的实例中运行结果是:0,48
,0
解释一下,所谓小整型,可以看出来用格式化输出%d是可以打出来,但是这个值是ascii而已,其实这个数值和0似乎除了ascii码表里的关系外,无关系了
而下面用printf("%c\n", a = 0);能输出么?
答案是能的,那么它怎么工作的?如果你是int,那么它会截取最后一个字节,它会打出什么呢?当然不会按照你的想法去输出,它会按十进制的那个值在ascii表中去查找对应的值然后输出
6、在字符串的处理的时候,往往不需要用while来专门控制'\0'
因为往往字符串中的其他字符会有条件限制,而'\0'在条件之外,那么不满足就不执行它而已,这样使占用资源减少,也减少了循环与条件之间的切换
7、在字符串与数字的处理中,一定要注意差别,字符串中可能有空白,可能有‘-’,‘+’
还有在double型的转换中,如何区别对待小数点前的数和小数点后的书(参见c程序设计语言p61)
注意isspace和isdigit的调用
8、注意itoa与atoi中的符号的处理
atoi中因为是符号处理,所以用一个sign只要做个条件判断
eg:sign = (s[i] == '-') ? -1 : 1;
itoa中因为是数字怎么让这个数字值保存起来呢?(参见c语言程序设计p53)
eg:if((sign = n) < 0)
n = -n;
...
if(sign
< 0)
s[i++] = '-';
9、int的大小在位操作中十分重要,一定要注意你的赋值,很有可能,你没有赋值满却还做着对前些位上的操作
同时还要注意0x1与~0的不同和使用!
前者只表示最后一位是1,而后者表示这个类型的所有位都是1
10、printf("\c");
c不是转义字符表项中的部分,那么这个printf会出现什么状况呢?不妨自己动手试一试
结果应该是打出一个c,为什么呢?
众所周知,转义字符后面有两类:1、规定好的几种,比如?、\、'、",等等
2、还有就是8进制和16进制数,而ascii码表中的所有的数都是可以用它们的十六进制或者八进制,通过转义字符转化为对应的字符的
那么c这个字符,其实在机器中式以ASCII码表中对应的16进制存储的,那么把它转化成自己本身也就很自然了,但需要注意的是,编译器是会发出警告的
注:紧跟字符不再定义的字符中,则其行为未定义,因此以上只是一种可能性,完全由编译器决定
11、增强可读性
(1)“幻数”使用宏定义去替换,这样直观,当然宏可以替换的不仅仅只是数,它可以简单替换任何字符序列
(2)浮点数的初始化和赋值用类似0.0的形式
(3)for语句使用于初始化和步长增加都是单步的,这样代码紧凑
(4)复合性质的表达式可以某种程度上减少变量
但一定要注意不要用过于复杂的复合语句
复合语句的可行性根据的一个原则:在允许使用某种类型变量值的任何场合,都可以使用该类型的更复杂的表达式(摘自:c程序设计语言)
12、关于计数
我们往往习惯于用int型去计数,再不然就是稍加大些用long型。那么如果还不够怎么办呢?
从《c程序设计语言》中学到的,用double型。有人会问,那可怎么行?后面那么多小数啊
为什么double也可以呢?我认为,用double无非是因为不够计数了,而计数本身每次也只是累加了一个1,那么不管你使用以上哪种类型,其实都是在当做整形的或者类似处理。只是double型打出来不美观罢了
下面用一种方式将其美观起来
double countnum;
printf("%.0f\n", countnum);
这个方法可行在于%.0f规定打印出来小数部分是0个,也就是不打印小数,多好的方式
13、对于\0的理解
\是个转义字符,\0是列出的那些转义字符中的么?我要说的是,当然是,最然没有直接列出,但是给出了一个\000,是用来将8进制转化成字符用的
那么\0不就属于其中了么,而且可以很明显的指导\0对应着ASCII中的0x00,这样理解起来不禁感觉一同百通
14、注意移植性
在代码中千万不要出现“幻数”, 一定要养成这样的习惯,比如EOF就是在c库中的典型案例
由于EOF在不同机器和不同编译器中的值是不一样的,因此代码中出现EOF就很好的解决了不同机器中值不同的问题,注意深入体会
15、if——else
碰到多个判断并列的情况当然要使用if-else而不要使用多个if的情况
原因在于,使用多个if由于是并列,其实只要执行其中的一个就可以了,那么这样就造成了机器执行了不必要的代码,效率就变低了
16、注意逻辑运算中与和或的巧妙转换
if(ch == ' ' && ch ==
sh)
;
else
putchar(ch);
于一下代码对比体会
if(ch != ' ' || sh != ' ')
putchar(ch);