声明:该读书笔记摘抄自《C和指针》——Kenneth A.Reek (著) 徐波(译)。为了克服自己走马观花,提高阅读和学习效率,决定将自己在读书过程中遇到的一些知识点加以摘抄和总结备忘,在此感谢原书作者和翻译。
一、关于位操作符
1、对于有符号数的右移操作是逻辑移位还是算术移位取决于编译器,并且此类程序是不可移植的;
2、将某个整型值的第n位置1, value |= (1 << n); 清0, value &= ~(1 << n); 测试是否为1, value & (1 << n), 如果是第n位是1,结果为非零值;
二、getchar 函数的返回值是整型,而不是char型,这主要是为了处理EOF文件结束符(即-1),如:
char c;
while (EOF != (c = getchar())) {
;
}
当这段代码运行在使用无符号字符集(即char的范围是0~255)的机器上,这段代码将是个死循环,因为c的值永远不可能是EOF(即-1);
即使这段代码运行在了使用有符号字符集的机器上,也只有在读取了值为\377的字节后,才会终止循环。\377为转义序列,代表一个八进制的数,对应无符号char为255,已经超出了有符号char所能表示的+127的正上限,此时会发生截短,然后整型提升,这样得到的值刚好和EOF一样。
改正:应当将变量c声明为int类型。
三、sizeof 运算符,在编译期间求值,它的操作数既可以是表达式(常常是单个变量),也可以是括号加上类型名,例如 sizeof( int ) sizeof ( x ) sizeof x 都是合法的。另外要注意,sizeof计算表达式的长度时不会对表达式进行求值,例如:sizeof ( a = b + 1) ,括号里面并没有向变量a赋值。
四、灵活逻辑运算符(利用&&、|| 最短求值 )、运用条件运算符、逗号表达式改善程序结构。
以上为第五章“运算符和表达式”摘抄总结,未完待续。。。