基本运算符
基本算术运算的运算符:=、+、-、*、/。(C没有指数运算符,用pow()函数代替)
赋值运算符=
赋值运算符=把右边的变量或者表达式的值赋给右边的变量。
#include <stdio.h> int main(void) { int jane,tarzan,cheeta; cheeta=tarzan=jane=68; printf(" cheeta tarzan jane\n"); printf("First round score %4d %8d %8d\n",cheeta,tarzan,jane); return 0; }
结果如下
cheeta tarzan jane First round score 68 68 68
加法运算符+
加法运算符+把两边的值加起来。
income=salary+bribes;
printf("%d",4+20);
减法运算符-
减法运算符-从前面的数减去后面的数。
takehome=224.00-24.00;
+和-运算符被称为二元或双值运算符,这表示它们需要两个操作数。
符号运算符-和+
这两个运算符用于指示一个值的代数符号。
rocky=-12; smokey=+12;
乘法运算符*
表示两数相乘。
cm=2.45*inch;
除法运算符/
用/表示除法。
整型数的除法和浮点数的除法有很大不同。浮点数除法得到浮点数结果,整数除法得到整数结果。但是整数不能有小数部分,当3去除5的时候,小数部分会被丢弃。
在C中,整数除法结果的小数部分会被丢弃,这个过程叫截尾。
#include <stdio.h> int main(void) { printf("integer division: 5/4 is %d \n",5/4); printf("integer division: 6/3 is %d \n",6/3); printf("integer division: 7/4 is %d \n",7/4); printf("floating division: 7./4. is %1.2f \n",7./4.); printf("mixed division:7./4 is %1.2f \n",7./4); return 0; }
结果如下
integer division: 5/4 is 1 integer division: 6/3 is 2 integer division: 7/4 is 1 floating division: 7./4. is 1.75 mixed division: 7./4 is 1.75
截尾是不会先四舍五入的,会直接将小数部分截掉。
当混合类型进行除法时,编译器会将两个操作数转变成一致的类型。
运算符的优先级
其他运算符
sizeof运算符和size_t类型
#include <stdio.h> int main(void) { int n=0; size_t intsize; intsize = sizeof(int); printf("n=%d,n has %zd bytes;all ints have %zd bytes.\n", n,sizeof n,intsize); return 0; }
sizeof运算符以字节为单位返回其操作数的大小。操作数可以是具体数据对象(如一个变量),或者一个类型(如float)。如果是一个类型,就必须放在括号里。
C规定sizeof返回size_t类型的值。这是一个无符号整数类型,它不是新类型,而是根据标准类型定义的。
C有一个typedef机制,它允许为已有的类型创建一个别名。例如:
typedef double real;
取模运算符%
取模运算符用于整数运算。它计算出两数相除的余数。
增量和减量运算符++和--
增量运算符将操作数的值加1.它有两种方式出现,++出现在变量前面是前缀模式,在变量后面是后缀模式。
#include <stdio.h> int main(void) { int ultra=0,super=0; while(super<5) { super++; ++ultra; printf("super=%d,ultra=%d\n",super,ultra); } return 0; }
输出结果如下
super=1,ultra=1 super=2,ultra=2 super=3,ultra=3 super=4,ultra=4 super=5,ultra=5
上面程序中的两个增量运算符语句等价于
super=super+1; ultra=ultra+1;
当然前缀模式和后缀模式是有区别的,以下示例显示了区别
#include <stdio.h> int main(void) { int a=1,b=1; int aplus,plusb; aplus=a++; plusb=++b; printf("a aplus b plusb \n"); printf("%1d %5d %5d %5d\n",a,aplus,plusb); return 0; }
结果如下
a aplus b plusb 2 1 2 2
前缀和后缀增量的区别就在于a++是使用a的值后再自增,++a是自增后再使用a的值。
当然这是当它们和其他运算合用的时候才会有的区别,单独使用增量运算符时是没有区别的。
自增运算符的优先级
增量和减量运算符有很高的优先级,只有圆括号比它们的优先级高。
不要太聪明
如果一次使用太多的增量运算符,就会出现不期望的结果。
while(num<21) { printf("%10d %10d\n",num,num*num++); }
这个程序看起来合理,其实它只能在某些系统上正常工作。问题是当printf()获取要打印的值时,它可能先计算最后一个参数的值,从而在计算其他参数之前增加num的值。所以,结果不会是:
5 25
而可能是:
6 25
另一个不确定的语句是:
ans=num/2+5*(1+num++);
在C中,编译器决定先计算哪个的值,所以如果先计算了num++,那么和先计算num/2就会是两个不同的结果。
通过两个原则避免这些问题:
如果一个变量出现在同一个函数的多个参数中时,不要将增量或减量运算符用于它上面。
当一个变量多次出现在一个表达式里时,不要将增量或减量运算符用于它上面。
表达式和语句
表达式(expression)是由运算符和操作数组合构成的。简单的表达式是一个单独的操作数。下面是一些表达式:
4 -6 a*(b+c/d)/20 q=5*2 x=++q%3 q>3
每一个表达式都有一个值
这是表达式最重要的属性。例如,
-4+6,值为2
c=3+8,值为11
5>3,值为1
6+(c=3+8),值为17
语句
语句是一条完整的计算机指令。在C中,语句用结束处的一个分号标识。
#include <stdio.h> int main(void) /*求出前20个整数的和*/ { int count,sum; /*声明语句*/ count=0; /*赋值语句*/ sum=0; while(count++<20) sum=sum+count; printf("sum=%d\n",sum); /*函数语句*/ return 0; }
声明语句用来声明变量。
赋值语句为变量赋值。
函数语句引起函数的执行。
while语句被称为结构化语句。