poincare1220

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

C语言程序设计现代方法_读书笔记

C语言程序设计现代方法

第2章 C语言基本概念

(P10)在C语言中,函数仅仅是一系列组合在一起并且赋予了名字的语句。

(P14)一旦变量被赋值,就可以用它来辅助计算其他变量的值。

(P17)C语言的一个通用原则:在任何需要数值的地方,都可以使用具有相同类型的表达式。

(P19)在C语言中,标识符可以含有字母、数字和下划线,但是必须以字母或者下划线开头,C语言是区分大小写的。

(P21)程序布局

  • 语句可以分开放在任意多行内。例如,下面的语句非常长,很难将它压缩在一行内:

    printf("Dimensional weight (pounds): %d\n", 
      (volume + INCHES_PER_POUND - 1) / INCHES_PER_POUND);
    
  • 空行可以把程序划分成逻辑单元,从而使读者更容易辨别程序的结构。就像没有章节的书一样,没有空行的程序很难阅读。

第3章 格式化输入/输出

3.1 printf 函数

(P28)printf函数的格式串

  • printf(格式串, 表达式 1, 表达式 2, ...);

    格式串包含普通字符和转换说明(conversion specification),其中转换说明以字符%开头。转换说明是用来表示打印过程中待填充的值的占位符。跟随在字符%后边的信息指定了把数值从内部形式(二进制)转换成打印形式(字符)的方法,这也就是“转换说明”这一术语的由来。

(P29)转换说明的说明

  • 更一般地,转换说明可以用%m.pX格式或%-m.pX格式,这里的m和p都是整数常量,而X是字母。m和p都是可选的。如果省略p,m和p之间的小数点也要去掉。在转换说明%10.2f中,m是10,p是2,而X是f。在转换说明%10f中,m是10,p(连同小数点一起)省去了;而在转换说 明%.2f中,p是2,m省去了。
  • 最小栏宽(minimum field width)m指定了要显示的最少字符数量。如果要显示的数值所需的字符数少于m,那么值在字段内是右对齐的。(换句话说,在值前面放置额外的空格。)在m前放上一个负号会导致左对齐。
  • 精度(precision)p的含义很难描述,因为它依赖于转换指定符(conversion specifier)X的选择。

3.2 scanf函数

(P32)scanf函数的工作方法

  • 对于格式串中的每一个转换说明,scanf函数从输入的数据中定位适当类型的项,并在必要时跳过空格。然后,scanf函数读入数据项,并且在遇到不可能属于此项的字符时停止。如果读入数据项成功,那么scanf函数会继续处理格式串的剩余部分;如果某一项不能成功读入,那么scanf函数将不再查看格式串的剩余部分(或者余下的输入数据),并立即返回。在寻找数的起始位置时,scanf函数会忽略空白字符(white-space character,包括空格符、水平和垂直制表符、换页符和换行符)。
  • 当scanf函数遇到一个不可能属于当前项的字符时,它会把此字符“放回原处”,以便在扫描下一个输入项或者下一次调用scanf函数时再次读入。

(P34)处理格式串中的普通字符

  • 空白字符。当在格式串中遇到一个或多个连续的空白字符时,scanf函数从输入中重复读空白字符,直到遇到一个非空白字符(把该字符“放回原处”)为止。格式串中空白字符的数量无关紧要,格式串中的一个空白字符可以与输入中任意数量的空白字符相匹配。(附带提一下,在格式串中包含空白字符并不意味着输入中必须包含空白字符。格式串中的一个空白字符可以与输入中任意数量的空白字符相匹配,包括零个。)
  • 其他字符。当在格式串中遇到非空白字符时,scanf函数将把它与下一个输入字符进行比较。如果两个字符相匹配,那么scanf函数会放弃输入字符,并继续处理格式串。如果两个字符不匹配,那么scanf函数会把不匹配的字符放回输入中,然后异常退出,而不进一步处理格式串或者从输入中读取字符。

第4章 表达式

4.1 算术运算符

(P41)当运算符/和运算符%用于负操作数时,其结果难以确定

  • 当运算符/和运算符%用于负操作数时,其结果难以确定。根据C89标准,如果两个操作数中有一个为负数,那么除法的结果既可以向上舍入也可以向下舍入。(例如,-9/7的结果既可以是-1也可以是-2。)在C89中,如果i或者j是负数,i%j的符号与具体实现有关。(例如,-9%7的值可能是-2或者5。)但是在C99中,除法的结果总是趋零截尾的(因此-9/7的结果是-1),i%j的值的符号与i的相同(因此-9%7的值是-2)。

(P42)运算符的结合性

  • 当表达式包含两个或更多个相同优先级的运算符时,仅有运算符优先级规则是不够用的。这种情况下,运算符的结合性(associativity)开始发挥作用。如果运算符是从左向右结合的,那么称这种运算符是左结合的(left associative)。二元算术运算符(即*、/、%、+和-)都是左结合的;如果运算符是从右向左结合的,那么称这种运算符是右结合的(right associative)。一元算术运算符(+和-)都是右结合的。

4.2 赋值运算符

(P45)赋值运算符要求它的左操作数必须是左值

  • 赋值运算符要求它的左操作数必须是左值(lvalue)。左值表示对象,而不是常量或计算的结果。变量是左值,而诸如10或2 * i这样的表达式则不是左值。目前为止,变量是已知的唯一左值。在后面的章节中,我们将介绍其他类型的左值。

4.3 自增运算符和自减运算符

(P47)自增自减运算符的优先级

  • 需要记住的是,后缀++和后缀--比一元的正号和负号优先级高,而且这两个后缀都是左结合的。前缀++和前缀--与一元的正号和负号优先级相同,而且这两个前缀都是右结合的。

4.5 表达式语句

(P50)表达式语句的用法

  • C 语言有一条不同寻常的规则,那就是任何表达式都可以用作语句。换句话说,不论表达式是什么类型、计算什么结果,我们都可以通过在后面添加分号将其转换成语句。

第5章 选择语句

(P56)C语言的语句类型(根据对语句执行顺序的影响分类)

  • 到目前为止,我们只见过两种语句:return语句(2.2 节)和表达式语句(4.5 节)。根据对语句执行顺序的影响,C 语言的其余语句大多属于以下 3 类。

    • 选择语句(selection statement)。if语句和switch语句允许程序在一组可选项中选择一条特定的执行路径。

    • 重复语句(iteration statement)。while语句、do语句和for语句支持重复(循环)操作。

    • 跳转语句(jump statement)。break语句、continue语句和goto语句导致无条件地跳转到程序中的某个位置。(return语句也属于此类。)

    C 语言还有其他两类语句,一类是复合语句(把几条语句组合成一条语句),一类是空语句(不执行任何操作)。

5.1 逻辑表达式

(P58)运算符&&和||的短路计算

  • 运算符&&和运算符||都对操作数进行“短路”计算。也就是说,这些运算符首先计算出左操作数的值,然后计算右操作数。如果表达式的值可以仅由左操作数的值推导出来,那么将不计算右操作数的值。

5.2 if 语句

(P63)条件表达式的说明

  • 条件运算符(conditional operator)由符号?和符号:组成,两个符号必须按如下格式一起使用:
    [条件表达式] 表达式 1 ? 表达式 2 : 表达式 3
    表达式 1表达式 2表达式 3 可以是任何类型的表达式,按上述方式组合成的表达式称为条件表达式(conditional expression)。条件运算符是 C 运算符中唯一一个要求 3 个操作数的运算符。因此,它通常被称为三元(ternary)运算符。

  • 条件表达式使程序更短小但也更难以阅读,因此最好避免使用。然而,在少数地方仍会使用条件表达式,其中一个就是return语句。许多程序员把

    if (i > j)
      return i;
    else
      return j;
    

    替换为

    return i > j ? i : j;
    

    printf函数的调用有时会得益于条件表达式。代码

    if (i > j)
      printf("%d\n", i);
    else
      printf("%d\n", j);
    

    可以简化为

    printf("%d\n", i > j ? i : j);
    

    条件表达式也普遍用于某些类型的宏定义中(14.3 节)。

(P66)C 语言中的布尔值

  • 除了_Bool类型的定义,C99 还提供了一个新的头<stdbool.h>,这使得操作布尔值更加容易。该头提供了bool宏,用来代表_Bool。如果程序中包含了<stdbool.h>,可以这样写:

    bool flag;  /* same as _Bool flag; */
    

    <stdbool.h>头还提供了true和false两个宏,分别代表 1 和 0。于是可以写

    flag = false; 
    ... 
    flag = true;
    

5.3 switch 语句

(P67)switch语句的常用格式

  • switch语句最常用的格式如下:

    [switch语句] switch (表达式) {
                   case 常量表达式 : 语句
                   ...
                   case 常量表达式 : 语句
                   default : 语句   
                 }              
    

    switch语句十分复杂,下面逐一看一下它的组成部分。

    • 控制表达式。switch后边必须跟着由圆括号括起来的整型表达式。C 语言把字符(7.3节)当成整数来处理,因此在switch语句中可以对字符进行判定。但是,这不适用于浮点数和字符串。

    • 分支标号。每个分支的开头都有一个标号,格式如下:

      case 常量表达式 :
      

      常量表达式(constant expression)很像普通的表达式,只是不能包含变量和函数调用。因此,5是常量表达式,5 + 10也是常量表达式,但n + 10不是常量表达式(除非n是表示常量的宏)。分支标号中常量表达式的值必须是整数(字符也可以)。

    • 语句。每个分支标号的后边可以跟任意数量的语句,并且不需要用花括号把这些语句括起来。(好好享受这一点,这可是 C 语言中少数几个不需要花括号的地方。)每组语句的最后一条通常是break语句。

    C 语言不允许有重复的分支标号,但对分支的顺序没有要求,特别是default分支不一定要放置在最后。

第6章 循环

(P77)不同类型循环语句的适用情况

  • while循环在循环体执行之前测试控制表达式,do循环在循环体执行之后测试控制表达式,for语句则非常适合那些递增或递减计数变量的循环。

6.2 do 语句

(P81)do 循环语句需要加上花括号

  • 无论需要与否,最好给所有的do语句都加上花括号,这是因为没有花括号的do语句很容易被误认为while语句:

    do
      printf("T minus %d and counting\n", i--);
    while (i > 0);
    

    粗心的读者可能会把单词while误认为while语句的开始。

6.3 for 语句

(P82)for 语句的格式

  • for语句的格式如下所示:
    [for 语句格式] for (声明或者表达式 1; 表达式 2; 表达式 3) 语句
    其中表达式 1、表达式 2 和表达式 3 全都是表达式。

(P84)在 for 语句中省略表达式

  • 如果省略第二个表达式,那么它默认为真值,因此for语句不会终止(除非以某种其他形式停止)。例如,某些程序员用下列for语句建立无限循环:

    [惯用法] for ( ; ; )...
    

posted on   Poincare_ZC  阅读(34)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示