《The C Programming Language》读书笔记2

原创 2004年07月30日 12:50:00

第二章:(本文首载于第二书店本人的暑假系列笔记)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

本章的内容是学习编程中最基础东西,任何一门语言都会告诉你他支持那些数据类型、那些运算、有那些特点、以及有那些不完善的东西。学习这些东西相对来说是单调了点,麻烦了点,但是只有通过了这座迷宫,你才能就进入c这个神奇的领域。因此初学者的成功至少有一半来自“耐心”。呵呵,准备好了吗?

本章的内容还是非常简单的,但是作者的字里行间隐藏了很多重要的信息,不加注意就会从我们的眼皮低下溜了去,下面将一一列出以示强调。

第一.变量和常量。很多人对于他们的区别很模糊,个人认为他们的主要区别在于是否分配内存空间,换句话说,就是是否存在左值。左值是什么?在第二章的从头到尾好像没找到这个名词,呵呵,你可以在附录中关于变量的条目中找到他,其实就是变量的地址,变量一旦被定义,左值就被确定了,一直到他的生存期结束。我们通常说的变量的值是指变量的右值。这才是我们能操作的对象。根据这个理论,那么就不难知道其实被const修饰的对象不是常量,他有左值,但是这里有个小麻烦,在本章的开头写明了被const修饰的是常量(本章第二段有个()说明),我查看了原版,并没有这个补充说明,看来应该是译者的理解,在《c专家编程》中的一个例子证明了我的想法是正确的,例子如下:

#include “stdio.h”

#include “stdlib.h”

#define one 1

const int two = 2;

int main()

{

    int ix = 1;

    switch( ix )

    {

        case one: printf( "this is 1" );/*ok*/

                  break;

        case two: printf( "this is 2" );/*error*/

    }

      system( "pause" );

      return 0;

}

大家都知道,case后面只能跟常量表达式,因此被const修饰的变量不是常量,只是变量的右值一般不能改变罢了。另外你也可以从上面感觉出#defineconst的区别。

第二.关于换码序列。这个更多地方叫转义字符,他们大多数是有一些特殊的功能的字符,在上篇笔记中你已经看到了他的一点威力,下面我们再看一段代码:

#include "stdio.h"

#include "string.h"

#include "stdlib.h"

int main()

{

    int ix;

    ix = strlen( "/0abc" );

    printf( "this is %d/n", ix );

    ix = strlen( "/007abc" );

    printf( "this is %d/n", ix );

    system( "pause" );

      return 0;

}

你会发现,两个差不多的字符串长度完全不一样,什么回事呢?第一个我们可以理解:/0是字符串结束符,因此其后的任何东西都不能算字符串的内容,因此长度为0。但是第二个呢?我们查了换码序列表就知道‘/007’这个为一个字符,因此长度为4。这个时候问题来了,编译器为什么没把‘/007’理解为‘/0’‘0’‘7’呢?如果这样的话长度也将为0,我们又没人为的加分割符号,呵呵,显然这个和编译器的具体实现相关,凭我们现有知识无法弄明白这点,姑且留着,等待“悟“的一天吧,相信我,这绝对是一种享受。

第三,关于++运算符,在很多教材上都有个看起来很经典的题目,其代码如下:

#include "stdio.h"

#include "stdlib.h"

int main()

{

    int ix, iy;

    iy = 1;

    ix = ( iy++ ) + ( iy++ ) + ( iy++ );

    printf( "this is %d/n", ix );

    iy = 1;

    ix = ( ++iy ) + ( iy++ ) + ( iy++ );

    printf( "this is %d/n", ix );

    iy = 1;

    ix = ( ++iy ) + ( ++iy ) + ( iy++ ) ;

    printf( "this is %d/n", ix );

    iy = 1;

    ix = ( ++iy ) + ( ++iy ) + ( ++iy ) ;

    printf( "this is %d/n", ix );

    system( "pause" );

      return 0;

}

呵呵,是不是很晕?这个本来无非为了说明先加后加的问题,这个地球人都知道,这里不加说明了,但是这样的程序本身就有很大的问题,编译器的运算并非一定是从左到右的(有些是按树的遍历来算的),因此你会发现不同的编译器结果会不一样,关于这个本章的结尾有很完整的解释,我就不再多说了,总之,这个测试本身就违背了语言的特性。

《The C Programming Language》读书笔记总结 <一>.基础篇

写了这么多年的C代码,回过头来再看《The C Programming Language》这本书,作者Brian W. Kernighan和C语言之父Dennis M. Ritchie。感觉里面的知识...
  • Eastmount
  • Eastmount
  • 2015年10月21日 16:14
  • 2086

读经典《C程序设计语言》(The C Programming Language)

作为软工专业的学生,大三下,我重新开始学习C语言,为什么呢?因为我发现在大学生涯里,我花了很多时间去刷GPA,花了很多时间去做了很多无谓的事情,以至于马上就面临找实习、找工作。自己甚至连一门语言都没有...
  • stc_XC
  • stc_XC
  • 2017年05月30日 22:54
  • 755

C程序设计语言(The C Programming Language) 读书笔记

C程序设计语言 The C Programming  Language 第1章      导言 1.1 1、C语言提供的转义字符序列还包括:\t表示制表符;\b表示回退符;\”表示双引号;\\表...
  • EclipseFlower
  • EclipseFlower
  • 2013年04月05日 12:40
  • 1201

《The C Programming Language》读书笔记总结 <一>.基础篇

写了这么多年的C代码,回过头来再看《The C Programming Language》这本书,作者Brian W. Kernighan和C语言之父Dennis M. Ritchie。感觉里面的...
  • paul123456789io
  • paul123456789io
  • 2017年02月09日 11:44
  • 388

The C Programming Language 第四章函数与程序结构 读书笔记

函数可以把大的计算任务分解成若干个较小的任务,程序设计人员可以基于函数进一步构造函数,而不需要重新编写一些代码。一个设计得当的函数可以把程序中不需要了解的具体操作细节隐藏起来,从而使得整个程序结构更加...
  • wtrnash
  • wtrnash
  • 2015年08月03日 21:15
  • 718

The C Programming Language 第三章控制流 读书笔记

程序语言中的控制流语句用于控制各计算操作执行的次序。 3.1语句与程序块 表达式之后加上一个分号(;)就变成了语句。 在C语言中,分号是语句结束符。 用一对花括号把一组声明和语句括在一...
  • wtrnash
  • wtrnash
  • 2015年07月28日 21:23
  • 495

摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文名“GPU编程与CG语言之阳春白雪下里巴人”

材质和光的交互除了反射现象,对于透明物体还存在透射现象。模拟光的透射现象通常是一个比较头痛的问题,因为需要至少计算光的两次透射方向,首先计算光从介质一进入介质二的透射方向,然后计算光从介质二进入介质一...
  • xuexiaokkk
  • xuexiaokkk
  • 2015年11月18日 16:18
  • 337

《Speech and Language Processing》读书笔记之信息抽取IE

Information Extraction 信息抽取 一、概述 1.1 IE 信息抽取就是从文本中抽取有限的几种语义内容,是将非结构化的文本转换为结构化数据的过程,有限的几种语义内容主...
  • ghnudt2000
  • ghnudt2000
  • 2015年10月10日 16:49
  • 477

The C Programming Language 第二章类型、运算符与表达式 读书笔记

变量和常量是程序处理的两种基本数据对象。 声明语句说明变量的名字及类型,也可以指定变量的初值。 运算符指定将要进行的操作。 表达式把变量与常量组合起来生成新的值。 对象的类型决定该对象可取值的...
  • wtrnash
  • wtrnash
  • 2015年07月25日 14:14
  • 350

the C programming language笔记<机械工业英文第2版>

1. int getchar()注意用int接收getchar传回的值,因为
  • ZF180
  • ZF180
  • 2014年09月06日 17:37
  • 1770
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《The C Programming Language》读书笔记2
举报原因:
原因补充:

(最多只允许输入30个字)