语句
1,C不具备专门的赋值语句,赋值是一种操作,统一使用表达式语句代替。
2,C不具备布尔类型,用整型代替,零值表假,非零表真。
3,关系操作运算符的结果是整型的0或1值,不是布尔的真或假。
4,switch语句的case标签是个常量表达式,必须具有唯一的值。
1)常量表达式是指在编绎期间求值的表达式,不能是变量。
2)case是确定语句列表的进入点,执行到语句列表的结束,增加break语句中断switch语句。
5,goto语句将程序的执行流从一条语句转移到另一条语句。
1)goto语句中的语句标签表示希望跳转的地方。
2)语句标签是标识符加冒号,可以出现在函数任何位置。
3)goto语句适合应用在跳出多层嵌套的循环,break语句只影响最内层循环,使用goto语句能立即从深层嵌套循环中退出。
操作符和表达式
1,算术操作符:+ - * / %,除了 % 操作符,其他操作符既适用于浮点型又适用于整型,当操作数都是整型时 / 执行整除运算,其他情况执行浮点数除法。
2,移位操作符把一个值的位向左或右移动。
1)左移位中,最左边的几位丢弃,右边空位由0补齐。
2)右移位一种是逻辑移位,左边移入的位用0填充。
3)一种是算术移位,左边移入的位由符号位填充,符号位为1移入位均为1,符号位为0移入位均为0,可保持正负形式不变。
4)算术左移和逻辑左移相同,算术右移和逻辑右移当操作数为负值时不同,使用哪种方式由编绎器决定。
3,赋值操作符=,赋值是表达式不是某种类型语句。
1)出现赋值表达式的地方允许赋值,将右操作数的值存储于左操作数指定位置。
2)赋值表达式的值就是左操作数的新值,可以作为其他赋值操作符的操作数。
3)赋值操作符从右到左结合,也是求值顺序。
4,单目操作符只接受一个操作数。
1)!执行逻辑反操作,实际产生一个整型结果0或1。
2)&操作符取变量的地址,赋值给指针变量。
3)*间接访问操作符,用于访问指针指向的值。
4)sizeof操作符判断操作数的类型长度,以字节为单位表示,可以是表达式也可以是变量,也可以是加上括号的类型名,不对表达式求值,如果表达式是个赋值表达式,返回赋值表达式值的长度,并不执行赋值操作。
5)(类型)操作符为强制类型转换,用于显式将表达式的值转换为另外的类型。
5,关系操作符产生的结果都是整型值0或1,而不是布尔值。
6,逻辑操作符短路求值。
1)&&左操作数首先求值,为真时继续对右操作数求值,左操作数为假,右操作数不再求值。
2)||左操作数为真继续对右操作数求值。
7,表达式求值顺序由所包含操作符的优先级和结合性决定,求值过程中还可能存在类型转换。
1)C的整型算术运算至少以缺省整型类型的精度进行,表达式中的字符型和短整型会转换为普通整型,即隐式的类型提升。
2)如果操作符的操作数属于不同的类型,需要操作数的一个类型转换为另一个类型,寻常算术转换顺序为:int->unsigned int->long int->unsigned long int->float->double->long double。
3)如果表达式求值结果超出类型范围,例a*b结果溢出,提前将a或b类型提升。
4)当整型转换为float型可能损失精度,float仅要求6位数字的精度,如果超过6位数字的整型值赋值给float型变量,结果可能只是该整型值的近似值。
5)当float型值转换为整型值时,小数部分舍弃,浮点值过大整型无法容纳时,结果未定义。
左值和右值
左值标识了可以存储结果的地址,可出现在赋值符号左边,右值仅仅是个值,只能出现在赋值符号的右边。