第二章——类型、运算符和表达式

变量名:
就是字母和数字还有下划线组成,而且最好能知道是干啥的。大写小写是不同的,书上写的是变量用小写,常量用大写。
数据类型:
char:字符型,占用一个字节。
int:整型
float:单精度浮点数,内存中占用4字节,32位,有效数字6~7位。
double:双精度浮点数,内存中占用8字节,64位,有效数字15~16位。
单精度双精度的简单区别就是单精度小数点后位数少于双精度浮点数。位数越多越精确。所以双精度浮点数更精确。
unsigned类型总是正数取值范围0~255。
signed有符号有可能是正有可能是负取值范围-128~127。
常量:
long类型以l或L结尾。
无符号以u或U结尾。
float以f或F结尾。
无后缀浮点数默认为double。
数字0表示八进制。
0x表示十六进制。
单引号括起来的是字符。
双引号括起来的是字符串。嗯书上说等于字符数组,都以‘\0’表示结尾。所以物理存储单元数比原字符多一个。
书上写的字符常量与字符串之间的区别‘x’与“x”是不同的。前者是字符是一个整数,值是在机器字符集中对应的数值。如‘0’对应48。后者是包含一个字符x和结束符‘\0’的字符数组。
枚举常量这个就是以指定的最后一个数值递增。具体啥用还没太明白。
声明:
所有变量必须先声明后使用自动变量需要初始化。
这里我有个不明白的就是变量用const限定。为什么不直接声明成常量。也许是数组?

1.二元算术运算符包括:+、-、*、/、%。
这没什么好说的。%取模运算符被取余数小于取余数则余数是其本身,并且不能应用于float和double类型。优先级与正常的算术运算优先级是一致的。而二元运算又比一元运算-、+优先级低。
2.关系运算符包括:>、>=、<、<=。
他们优先级相同。==、!=仅此于他们。
关系运算符的优先级比算术运算符的优先级低。
3.逻辑运算符&&、||。
这俩解释起来挺麻烦的。
用&&链接的两个表达式,左侧表达式返回值为真时则对右侧的表达式进行求值。
用||链接的两个表达式,左侧表达式返回值为假时则对右侧表达式进行求值。
简单的说就是&&左侧的表达式执行成功了才能执行右侧的,||左侧的表达式执行失败了才能执行右侧的。浓缩一下就是&&代表与,||代表或。&&的优先级比||高。
根据定义。在关系表达式和逻辑表达式中,如果未真,则结果为1。如果未假,则结果为0。所以不管多复杂的判断式,结果只有两个真或者假。
逻辑非!就是把真说成假,把假说成真。
逻辑运算符确实是需要一定的逻辑思维。。。
4.类型转换。
类型不同的两个操作数或者运算符进行运算就需要把他们变成想通的类型。通常自动转换是把‘比较窄的’转换成‘比较宽的’这样就不会丢失信息。
把‘比较长的类型’转换成‘比较窄的’会丢失信息,并且编译器会发出警告信息。但是并不非法
为了增加可移植性,最好在声明类型时进行符号限定。
float类型不会自动转换为double类型
书上的-1L>1UL是因为-1L被提升为unsigned long 类型,在有符号的情况下,最高为表示正负,“-”表示其二进制最高位为1,
所以当-1L被转化为unsigned long 类型的无符号类型时,-1L就变成了(100000000000000000000000000000001),也就是一个很大的正整数了,所以-1L会比1UL大。
最好还是避免这种容易让人误解的情况。
还可以通过(类型名)表达式 进行强制类型转换。转换时生成了一个指定类型的表达式的值去运算。而原表达式的值并没有变。优先级与其他一元运算符相同。
5.自增、自减运算符:++、--。
简单一句话总结就是前自增、自减就是先于运算进行自增、自减。后自增、自减就是在运算后进行自增、自减。
6.按位运算符: &按位与、|按位或、^按位异或、<<左移、>>右移、~按位取反。这些运算符计算我感觉是最麻烦的。虽然现在的机器性能已经不太需要这种按位运算,但是我感觉在极限情况下还是有用的。能熟练的掌握这种运算也是有好处的。
最低位是最右侧,最高位是最左侧。
有个口诀是:
清零取反要用与,某位置一要用或。
若要取反和交换,轻轻松松用异或。
按位与&相同位都为1时结果才为1否则为0,
按位或|相同位只要有一个为1结果就为1。
按位异或^相同位相同则为0不同则为1。我也不知道怎么解释了。
按位取反·比较好理解,他是一元运算符,就是将自己本身位的1变成0、0变成1。
这里的细节书上讲的比较详细,多看几遍应该没问题。然后再看一些按位运算的练习就像做数学题那样应该就可以了。
7.条件表达式,简单一句话就是判断式为1(真)则引用第一个,如果为0(假)则引用第二个。
其实这章讲的都是比较基础的有第一章的理解这里看起来还是比较容易的。
然后看一下习题部分。

你可能感兴趣的:(第二章——类型、运算符和表达式)