KaranocaVe's Blog Help

《C语言解惑》批注

在此记录一些迷惑性较强的谜题。

第一章 操作符

1.1.3

int x; x = - 3 * 4 % - 6 / 5 ;

* % / 同级,从左到右关联。

1.3.4

z = x +++++ y; //因为遵循原则“构成操作符的字符个数越多越好”,所以会被解释为 z = x ++ ++ + y; //而非 z = x ++ + ++ y;

1.3.5

int x,z; z = x / ++ x ;

第二章 基本类型

2.1.2

顺序未定义。

unsigned int ux=-2; printf("%o",ux);

注意补码。

int x=-2; printf("%o",x>>1);

取决于特定的实现怎样在位移时处理符号位。

2.2.4

(double) 100/3;

一元运算符的优先级很高。

2.2.5

(int) 33333; (double) ( (int) 33333 );

int16上溢。
C语言中,即使运算发生了溢出,其结果仍旧是一个可预料的、合法的值。 但是真正的结果已经丢失了。

第四章 控制流

注意概念

  • 循环条件

  • 退出条件

  • 初始值

  • 修改效果

第五章 编程风格

关于编程风格(也就是哪些结构应该避免,哪些结构应该效仿)的书籍实在不少, 从一个似乎是不同的角度得出的一个大概的结论是, 所谓良好的编程风格在很本程度上属子一种个人品位
但从比较客观合理的角度看, 编程风格的好坏在于程序员是否具有良好的判断力——就像许多其他事情一样。
在笔者看来,虽然评价编程风格是否优良的标准有很多, 但放之四海而皆准的编程风格规则并不多。
根据以上的观点可认为,下面这些谜题说明了一些常见的不良的编程风格。
这些谜题的解答与其说是标准答案,不如说是一种更好的选择。
在笔者看来,如果有什么是优良编程风格的关键的话, 那就是必须让你编写出来的程序适合其他人阅读,而这又具体表现在两个方面:

5.1.1

continue语句通常可以通过改变测试条件来实现, 而这种改变有时会显著改善程序代码的可读性。

5.1.3

有经验的程序员都知道多层嵌套的if语句最容易出问题:
在到达最内层的条件时,外层的条件已经被忘记或模糊不清了。
解决这个问题的办法是从一开始就把每个条件都完整地写清楚,
但是往往会导致1条件表达式即冗长又不容易看懂。
在遇到这种情况的时候,良好的判断力是重要的!

5.2.1

done=i=0; while (i<MAXI && !done){ if((x/2=1)>1){i++;continue;} done++: }

可以改写为

while ( i < MAXI && ( x /= 2 ) > 1 ) i++ ; for ( i=0; i < MAXI && ( x /= 2 ) > 1 ; i++ );

5.2.2

在C语言里,一种想法往往会有多种表达方式,而程序员的任务就是把各有关细节组织成一些条理清晰的语句块。
C语言提供了以下元素来帮助程序员组织各有关细节:

  • 把最基本的想法写成表达式

  • 把表达式足之处语句

  • 把语句组织为语句块和函数

19 August 2024