小结
概念与术语
■ 运算符的运算对象叫做操作数。
■ 初等表达式是“变量名或函数名”、“常量”、“裸串”及“(表达式)”之一。
■ 只有在函数调用时函数名后面紧跟的“()”才是运算符。
■ 运算符可以与初等表达式按照C语言规则构成表达式。
■ 左值表示的是一块连续的具有某种类型的存储空间。
■ 函数调用是表达式。
■ 优先级和结合性是确定运算符运算对象的规则,不是确定运算次序的规则。
■ 只有右值存在类型转换。
■ 类型转换的含义是求一个值的指定类型的对应值。
■ 有两种类型转换:隐式转换和显式转换。
■ 转换运算符由一对括号和括号内的类型的名字构成。
■ 整数类型转换成unsigned类型总是有确定结果的。
■ 进行赋值运算时,赋值号右面的值总是必须转换成赋值号左面的类型。
■ (signed和unsigned)char、short类型值总是被编译器转换成int或unsigned类型的值。这叫整数提升(Integer Promotions )。
■ 在进行二元运算时,编译器将把两个操作数转换成一种公共类型。这个公共类型在多数情况下是两个操作数中的较高级别的类型,这种级别的高低次序为long double, double, float,整数类型。
■ 可以通过调用scanf()来输入变量的值。
■ 通过调用scanf()来输入变量的值时,变量名前通常要有&。
■ 除了scanf(),字符变量也可以用getchar()输入。
■ 调用printf()函数时,float类型的参数值都被编译器转换为对应的double类型值。
■ 整数类型转换级别由高到低为:(unsigned)long long,(unsigned)long,(unsigned)int。
■ 语句总是以“;”或“}”作为结束标志。
■ 一个合法的表达式后面加上“;”即构成了一个表达式语句。
■ 变量定义或声明不属于语句。
■ C语言的任何语句都必须写在某个“{}”之内。
■ 空语句仅由一个“;”或一对空的“{}”构成。
■ 由上至下依次执行的程序结构叫顺序结构。
■ 把若干语句用“{}”括起来构成一条复合语句。
■ 在C语言中,被“{}”括起来的语法成分被称为“块”。
■ 算法必须具备可行性、确定性、有穷性,必须有输出。
风格与习惯
■ 在书写表达式时,可以通过加“()”的方法使运算符的运算对象更为明显,这可以增加代码的可读性。
■ 在运算符两侧加上空格可以使代码显得更清晰。
■ 尽量不要依赖编译器进行隐式类型转换。直接用cast运算写出的类型转换使代码更清晰可读。
■ 利用“{}”把代码分成若干逻辑单元块,可以使代码更具可读性。
■ 把若干条语句写在一行会使代码显得拥挤不堪,且不利于阅读、修改代码。
常见错误
■ 写出“scanf("%d",i);”这样的语句。
■ 写出scanf("%d\n",&i);这样的语句。
■ 初学者有时容易误把(int)3.写成int(3)。
■ 在复合语句的后面画蛇添足地写一“;”。
■ 在描述算法时或书写代码时不注意次序。
牛角尖
sizeof(long)-2的含义是什么?
这个表达式令人困惑的地方在于它可能有以下两种解释。
①sizeof((long)-2),即对-2进行类型转换得到的long类型值的sizeof运算。
②(sizeof(long))-2,即long类型的sizeof运算结果与2的差。
由于sizeof与(long)运算的优先级相同,且结合性从左到右。所以sizeof(long)-2的含义是后一种。
sizeof(int)是初等表达式吗?
不是。这个表达式是“(int)”的sizeof运算,这里“(int)”应该视为一种特殊的初等表达式。
可以进行下面的类型转换吗?
可以。任何类型都可以转换为void类型,表示对值的舍弃。事实上,多数情况下,printf()函数的值没有被用到,前面的写法与
的意思是一样的,但却是更加一本正经的写法。