天天看点

C Primer Plus (第六版) 中文版 随手笔记(四)

声明:本篇文章只是个人知识盲区、知识弱点、重点部分的归纳总结,望各位大佬不喜勿喷。梳理顺序是按照书籍的实际顺序梳理,转载请注明出处。

作者:sumjess

适用:这本书我已经看过4遍了,但是该书的知识点我并不是都常用,所以总会有忘记的,所以来写这本书的随手笔记,记录重点、易忘点。该博客可以当做字典,也可以当做你的笔记。

目前内容:第五章总结

第五章:运算符、表达式和语句

1、基本运算符:

    (1)赋值运算符:=

            几个术语:数据对象、左值、右值和运算符:

            赋值运算符目的是把值储存到内存位置上。用于存储的数据储存区统称为数据对象(data object)。               左值是C语言的术语,用于标识特定数据对象的名称或表达式。对象指的是实际的数据存储,而左值是               用于标识或定位储存位置的标签。右值指的是能赋值给可修改左值的量,且本身不是左值。在学习名称             时被称为“项”(如,赋值运算符左侧的项)的就是运算对象。

        C语言可以连续赋值:a=b=c=5;

    (2)加法运算符:+

             加法运算符用于加法运算,使两侧的值相加。

             相加的值(运算对象)可以是变量,也可以是常量。

    (3)减法运算符:-

             减法运算符用于减法运算,使两侧的值相减。

             相减的值(运算对象)可以是变量,也可以是常量。

             +和-运算符都可以被称为二元运算符,及这些运算符需要两个运算对象才能完成操作。

    (4)乘法运算符:*

             乘法运算符用于乘法运算,使两侧的值相乘。

             相乘的值(运算对象)可以是变量,也可以是常量。

    (5)除法运算符:/

除法运算符用于除法运算,使两侧的值相除。

除的值(运算对象)可以是变量,也可以是常量。

注意:

整数除法会截断计算结果的小数部分(丢弃整个小数部分),不会四舍五入结果;混合整数和浮                       点数计算的结果是浮点数。

    (6)运算符优先级:

            非常全的​​http://www.slyar.com/blog/c-operator-priority.html​​

2、其他运算符:

    (1)sizeof运算符和size_t类型:

sizeof运算符以字节为单位返回运算对象的大小(在C中,1字节定义为char类型占用的空间大小。过去,1字节通常是8位)。运算对象可以是具体的数据对象(如,变量名)或类型。如果运算对象是类型(如,float),则必须用圆括号将其括起来。

//使用C99新增的%zd转换说明 --- 如果编译
//器不支持%zd,请将其改成%u或%lu 
#include <stdio.h>
int main(void)
{
  int n=0;
  size_t insize;
  
  intsize=sizeof(int);
  printf("n=%d,n has %zd bytes;all ints have %zd bytes.\n",n,sizeof n,intsize);
  
  return 0;
}      

C语言规定,sizrof返回size_t类型的。这是一无符号整数类型,但他不是新类型。C语言系统中可以使用typedef把size_t作为unsigned int或unsigned long的别名。

    (2)求模运算符:%

求模运算符用于整数计算。求模运算符给出其左侧整数除以右侧整数的余数。求模运算符只能用于整数,不能用于浮点数。

注意:如果第一个运算符是负数,那么求模的结果就是负数;如果第一个运算符是正数,那么求模的结果就是正数。

    (3)递增运算符:++

递增运算符执行简单的任务,就是其运算对象递增加一。

有两种形式:++a和a++两种形式,区别在于递增行为发生的时间不同。

#include <stdio.h>
int main(void)
{
  int a=1,b=1;
  int a_post,pre_b;
  
  a_post=a++;//后缀递增
  pre_b=++b;//前缀递增
  printf("a  a_post  b  pre_b\n");
  printf("%ld %5d %5d %5d",a,a_post,b,pre_b);
  
  return 0;
}      
C Primer Plus (第六版) 中文版 随手笔记(四)

即:n++是先使用n,再递增,而++n是先递增n,再使用。

    (4)递减运算符:--

            与 递增运算符:++ 类似不再介绍

            注意:① 如果一个变量出现在一个函数的多个参数中,不要对该变量使用递增或递减运算符;

如果一个变量多次出现在一个表达式中,不要对该变量使用递增或递减运算符;

3、类型转换:

    (1)基本的类型转换规则:

            1、当类型转换出现在表达式时,无论是unsigned还是signed的char和short都会被自动转换成int,如果有必要会被转换成unsigned int(如果short和int的大小相同unsigned short就比int大。这种情况下,unsigned short将会被转换成unsigned int)。由于都是从较小类型转换成较大类型,所以这些转换被称为升级。

            2、涉及两种类型运算,两个值会被分别转换成两种类型的更高级别。

           3、类型的级别从高到低依次是long double、double、float、unsignedlong long、long long、unsigned long、long、unsigned int、int。(例外的情况:当long和int的大小相同时,unsigned int比long的级别更高。之所以short和char类型没有列出,是因为它们已经被升级到int或unsigned int)

            4、在赋值表达式语句中,计算的最终结果会被转换成被赋值变量的类型。这个过程可能会导致类型升级或降级。所谓降级,是指把一种类型转换成更低的级别的类型。

            5、当作为函数参数传递时,char和short被转换成int,float被转换为double。

    (2)如果待转换的值与目标类型不匹配怎么办?这取决于转换涉及的类型。待赋值的值与目标类型不匹配时,规则如下。

            1、目标类型是无符号整型,且待赋的值是整数时,额外的位将被忽略。

            2、如果目标类型是一个有符号整数,且赋值的值是整数,结果因现实而异。

            3、如果目标类型是个整数,且待赋的值是浮点数,该行为是未定义的。

    (3)强制类型转换运算符:

            1、用处、用法:

                有时需要进行精确的类型转换,或者在程序中表明类型转换的意图。这种情况下要用到强制转换类型,即在某个量的前面放置用圆括号括起来的类型名,该类型名即是希望转换成的目标类型。

            2、通用形式:

mice=(int)1.6+(float)10      

            3、注意:

                 一般而言,不应该混合使用类型(因此有些语言直接不允许这样做),但是偶尔这样做也是有用的。C语言的原则是避免给程序员设置障碍,但是程序员必须承担使用的风险和责任。

4、带参数的函数:

    (1)声明参数就创建了被称为形式参数(简称形参)的变量;

继续阅读