• 《C Primer Plus》阅读笔记(2)


    第4章 字符串和格式化输入/输出
    1、C语言没有为字符串定义专门的变量类型,而是把它存储在char数组中。字符串中的字符存放在相邻的存储单元中,每个字符占用一个单元。
    2、使用%s的scanf()只会把一个单词而不是把整个语句作为字符串读入。
    3、创建符号常量的三种方法:
      <1>使用#define预处理器定义(#define也可用于定义字符和字符串常量,前者用单引号,后者用双引号);
      <2>使用const关键字把一个变量声明转换成常量声明;
      <3>使用枚举(enum)创建符号常量。
    4、printf()函数返回所打印的字符的数目;scanf()函数返回成功读入的项目的个数,如果没有读取任何项目(比如期望一个数字而却键入一个非数字字符就会发生这种情况),scanf()会返回0。
    5、printf()和scanf()都可以使用*修饰符来修饰说明符的意义,但它们的方式不同。在printf()中如果转换说明符是%*d,那么参数列表中应该包括一个*的值(表示字段宽度)和一个d的值。在scanf()中,当把它放在%和说明符字母之间时,它使函数跳过相应的输入项目。

    第5章 运算符、表达式和语句
    1、赋值运算符的动作是从右到左。赋值运算符左边必须指向一个存储位置,最简单的方法是使用变量的名字。C使用术语“可修改的左值”(modifiable lvalue)来标识那些我们可以为之赋值的实体。
    左值(lvalue)指用于标识一个特定的数据对象的名字或表达式。
    右值(rvalue)指的是能赋给可修改的左值的量。
    2、在C中,整数除法结果的小数部分都被丢弃,这个过程被称为截尾(truncation)。关于负数整数除法,C99要求使用“趋零截尾”,所以假如结果为-3.8,则会被转换成-3.
    3、sizeof运算符:
    sizeof运算符以字节为单位返回其操作数的大小。操作数可以是一个具体的数据对象(例如一个变量名),或者一个类型。如果它是一个类型(如float),操作数必须被括在圆括号里。C规定sizeof返回size_t类型的值,这是一个无符号整数类型。
    4、负数的取模运算应遵照什么规则?如果第一个操作数为负数,那么得到的模也为负数;如果第一个操作数为正,那么得到的模也为正数。实际上,不管在什么情况下,如果a和b都是整数值,可以通过从a中减去(a/b)*b来计算a%b。
    5、使用增量运算符(++)通常产生更高效的机器语言代码,因为它与实际的机器语言指令相似。
    6、增量和减量运算符有很高的结合优先级:只有圆括号比它们的优先级高(注:数组下标运算符和成员选择运算符也都比增量和减量运算符优先级高,感谢garbageMan在评论中指出)。增量运算符和减量运算符只能影响一个变量(一个可修改的左值)。
    7、在C中,编译器可以选择先计算函数里哪个参数的值。这个自由提高了编译器的效率,但是如果在函数参数里使用了增量运算符就会带来麻烦。另外避免使用如下的语句:
      ans = num/2 +5*(1 + num++);
      另一个可能产生麻烦的例子如下:
      n = 3;
      y = n++ + n++;
      在使用增量或减量运算符时,要遵循如下原则以避免出现问题:
      <1>如果一个变量出现在同一个函数的多个参数中时,不要将增量或者减量运算符用于它上面。
      <2>当一个变量多次出现在一个表达式里时,不要将增量或减量运算符运用到它的上面。
    8、C的一个重要的属性是每一个C表达式都有一个值。赋值语句是表达式语句的特例,表达式q = 5*2作为一个整体的值为10。
    9、副作用和顺序点:
      副作用(side effect)是对数据对象或文件的修改。
      一个顺序点(sequence point)是程序执行中的一点:在该点处,所有的副作用都在进入下一步前被计算。在C中,语句里的分号标志了一个顺序点,它意味着在一个语句中赋值运算符、增量运算符及减量运算符所做的全部改变必须在程序进入下一个语句前发生。任何一个完整的表达式的结束也是一个顺序点。
    10、类型转换
      <1>当出现在表达式里时,有符号和无符号的char和short类型都将自动被转换为int,在需要的情况下将自动被转换为unsigned int。因为是转换成较大的类型,所以这些转换被称为提升(promotion)。
      <2>在包含两种数据类型的任何运算里,两个值都被转换成两种类型里较高的的级别。
      <3>类型级别从高到低的顺序是long double, double, float, unsigned long long, long long, unsigned long, long, unsigned int和int。之所以short和char类型没有出现在此清单里,是因为它们已经被提升到int或也可能被提升到unsigned int。
      <4>在赋值语句里,计算的最后结果被转换成将要被赋予值的那个变量的类型。这个过程可能导致提升,也可能导致降级(demotion),降级是将一个值转换成一个更低级的类型。
      <5>当作为函数的参数被传递时,char和short会被转换为int,float会被转换为double。可以通过函数原型来阻止自动提升的发生。原型(prototype)是一个函数声明,它描述了函数的返回值和它的参数。
    11、C允许写出将不同的数值类型组合在一起的表达式,但是算术运算要求操作数是同一类型的,所以C进行自动转换。然而,不依赖于自动转换是一个很好的编程习惯。

  • 相关阅读:
    1063. Set Similarity
    A1047. Student List for Course
    A1039. Course List for Student
    最大公约数、素数、分数运算、超长整数计算总结
    A1024. Palindromic Number
    A1023. Have Fun with Numbers
    A1059. Prime Factors
    A1096. Consecutive Factors
    A1078. Hashing
    A1015. Reversible Primes
  • 原文地址:https://www.cnblogs.com/geekham/p/3048337.html
Copyright © 2020-2023  润新知