C陷阱与缺陷

最新书摘:
  • 豆友66618502
    2014-10-19
    但是,引用一个并不存在的元素又有什么意义呢?幸运的是,我们并不需要引用这个元素,而只需要引用这个元素的地址,并且这个地址在我们遇到的所有的C语言中又是“千真万确”存在的。而且,ANSI C标准明确允许这种用法:数组中并不存在的“溢界”元素的地址位于数组所占内存之后,这个地址可以用于进行赋值和比较。当然,如果要引用该元素,那就是非法的了。
  • southstarj
    2014-03-28
    char c;while((c = getchar()) == EOF)putchar(c);
  • LiXiaNG
    2013-06-08
    信号非常复杂棘手,而且具有一些从本质上而言不可移植的特性。解决这个问题我们最好采取“守势”,让 signal 处理函数尽可能地简单,并将他们组织在一起。这样,当需要适应一个新系统时,我们可以很容易地进行修改。
  • LiXiaNG
    2013-06-07
    保证一个特定名称的所有外部定义在每个目标模块中都有相同的类型,一般来说是程序员的责任。
  • LiXiaNG
    2013-06-07
    因为函数printf与函数scanf在不同情形下可以接受不同类型的参数,所以它们特别容易出错。
  • LiXiaNG
    2013-06-06
    复制指针并不同时复制指针所指向的数据
  • LiXiaNG
    2013-06-05
    对于一个数组,我们只能够做两件事,确定该数组的大小,以及获得指向该数组下标为0的元素的指针。其他有关数组的操作,哪怕它们乍看上去是以数组下标进行运算的,实际上都是通过指针进行的。换句话说,任何一个数组下标运算都等同于一个对应的指针运算,因此我们完全可以依据指针行为定义数组下标的行为。
  • LiXiaNG
    2013-06-05
    要理解一个C程序,仅仅理解组成该程序的符号是不够的。程序员还必须理解这些符号是如何组合成声明、表达式、语句和程序的。虽然这些组合方式的定义都很完备,几乎无懈可击,但有时这些定义与人们的直觉相悖,或者容易引起混淆。
  • byhard
    2013-04-03
    It is the programmer’s responsibility to ensure that the arguments to a function are of the right type.C has two simple rules that control conversion of function arguments: (1) integer values shorter than an int are converted to int; (2) floating-point values shorter than a double are converted to double. All other values are left unconverted.
  • [已注销]
    2012-12-25
    假定我们让 a 除以 b,商为 q,余数为 r,我们希望 a、b、q、r 之间维持怎样的关系呢?1. 最重要的一点,我们希望 q * b + r == a,因为这是定义余数的关系。2. 如果我们改变 a 的正负号,我们希望这会改变 q 的符号,但这不会改变 q 的绝对值。3. 当 b > 0 时,我们希望保证 r >= 0 且 r < b。...然而, C 语言的定义只保证了性质 1,以及当 a >= 0 且 b > 0 时,保证 |r| < |b| 以及 r >= 0。
  • [已注销]
    2012-12-24
    #define max(a, b) ((a) > (b) ? (a) : (b))max(biggest, x[i++])... 上面代码中的赋值语句将被扩展为:biggest = ((biggest) > (x[i++]) ? (biggest) : (x[i++]));...解决这类问题的一个办法是,确保宏 max 中的参数没有副作用。
  • [已注销]
    2012-12-21
    Koenig: "Koenig" 是一个很常见的德国姓,... 意义是“国王”。不过我的情况很特殊,我祖上是波兰和乌克兰人,不是德国人。这个名字其实是一个长长的波兰姓氏的缩写。 ... 我们家里人从来不这么说。Moo: 谈到我这个姓氏,最重要的一点就是,其发音跟牛叫的声音一模一样
  • [已注销]
    2012-12-21
    两个具有相同名称的外部对象实际上代表的是同一个对象。static 修饰符是一个能够减少此类命名冲突的有用工具。 ... a 的作用域限制在一个源文件内,对于其他源文件,a 是不可见的。因此,如果若干个函数需要共享一组外部对象,可以将这些函数放到一个源文件中,把它们需要用到的对象也都在同一个源文件中以 static 修饰符声明。
  • [已注销]
    2012-12-21
    C 语言中的一个重要思想就是分别编译(Separate Compilation),即若干个源程序可以在不同的时候单独进行编译,然后在恰当的时候整合在一起。典型的连接器把由编译器生成的若干个目标模块,整合成一个被称为载入模块或可执行文件的实体,该实体能够被操作系统直接执行。其中,某些目标模块是直接作为输入提供给连接器的;而另外一些目标模块则是根据连接过程的需要,从包括有类似 printf 函数的库文件中取得的。连接器通常把目标模块看成是由一组外部对象(external object)组成的。每个外部对象代表者机器内存中的某个部分,并通过一个外部名称来识别。
  • [已注销]
    2012-12-21
    前面一段讨论了解决这个问题的两种方法, 实际上提示了我们避免“栏杆错误”的两个通用原则:(1) 首先考虑最简单情况下的特例,然后将得到的结果外推,这是原则一。(2) 仔细计算边界,绝不掉以轻心,这是原则二。
  • [已注销]
    2012-12-21
    编译器将程序分解成符号的方法是,从左到右一个字符一个字符地读入,如果该字符可能组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分;如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串已不可能组成一个有意义的符号。“如果(编译器的)输入流截止至某个字符之前都已经被分解为一个个符号,那么下一个符号将包括从该字符之后可能组成一个符号的最长字符串、”
  • WingStone
    2011-11-17
    "另一种考虑不对称边界的方式是,把上界视作某序列中第一个被占用的元素,而把下界视作序列中第一个被释放的元素."
  • 豆友66618502
    2014-10-21
    上面的例子代码打开了文件名由变量file指定的文件,对于存取权限的设定表明程序希望对这个文件进行输入和输出操作。编程者也许认为,程序一旦执行上述操作完毕,就可以自由地交错进行读出和写入的操作。遗憾的是,事实总难遂人所愿,为了保持与过去不能同时进行读写操作的程序的向下兼容性,一个输入操作不能随后直接紧跟一个输出操作,反之亦然。如果要同时进行输入和输出操作,必须在其中插入fseek函数的调用。
  • 豆友66618502
    2014-10-21
    许多系统中的标准输入/输出库都允许程序打开一个文件,同时进行写入和读出的操作: