运算符
1.几个术语:
“左值”:指用于标志一个特定的数据对象的名字或表达式,例如变量。
“右值”:指的是能赋给可修改的左值的量。
“副作用”:对数据对象或文件的修改,如num=50。
“一个顺序点”:是程序执行的一点,在该点处,所有的副作用都在进入下一步前被计算。
注:语句里的分号,完整表达式的结束,都是一个顺序点。
2.运算符++与--优先级仅次于()
不能对 变量使用++,--的情况:
<1>当一个变量出现在同一个函数的多个参数中时;<2>当一个变量多次出现在一个表达式里;<3>不能做宏函数的参数
ey:printf("%10d,%10d",num,num*num++);
ans=num*2+num++;
原因:编译器不能保证先计算num*2或先计算num++。
3.逗号运算符(多用在for中)
该运算符有2个属性:被它分开的表达式按从左到右的次序进行计算(即逗号是个顺序点);
整个逗号表达式的值是右边成员的值。
ey: <1> n++,m=n*3 第二个表达式使用的是更新后的n
<2> x=(y=3,(z=++y+2)+5) 先把 y赋3,把y递增为4,y+2为6赋给z,z+5赋给x,x=11
<3>int n,m; n=200,300; m=(n=200,300); 结果是n=200,m=300
n=200,300;是个逗号表达式,值为300,n被赋值为200
<4>char n,m;中逗号用作分隔符。
4.关系运算符==:运算符==的优先级比=高,所以while(scanf("%d",&num)==1)
while(canoes=5){} 如果写错将进入死循环且编译器无语法错误
5=canoes;能检查出语法错误
5==canoes;检查canoes的值是否为5
5.逻辑运算符&& 与 ||
C保证逻辑表达式是从左至右求值的,&&和||是序列的分界点,故在前进到下一个操作数之前,所有的副作用都会生效。
并且,C保证一旦发现某个元素使表达式总体无效,求值将立刻停止。
ey:while((c=getchar())!=' ' && c != '\n') //循环读入字符,直到出现空格和换行
if(num != 0 && 12/num == 2) //如果num=0,第一个表达式为假,就不在对关系表达式求值,避免计算机把0作除数。
6.条件运算符?:
形式: expression1 ? expression2 : expression3
若expression1为真,表达式的值为expression2,否则为expression3。ey:(5>3) ? 1 : 2
7.位逻辑运算符:不改变其本身的值
#define BIT0 (0x1) #define BIT1 (0x1 << 1) ....
<1>掩码MASK=BIT0 | BIT3 ... 掩码中的0看作不透明,1看作透明。
<2>打开位flags |= MASK MASK中1将flags中相应的位设为1
<3>关闭位flags &= ~MASK MASK中1将flags中相应的位设为0
<4>转置位flags ^= MASK MASK中1将flags中相应的位取反
<5>查看一位的值 a = flags & MASK
<6>num<<n 并不改变num本身的值 num乘以2^n
C运算符优先级
注意:
<1>sizeof运算符和size_t类型(C99)
size_t是一个无符号整数类型,不是新类型。printf()说明符%z,%u,%lu
sizeof返回size_t类型的值。
<2>%取模运算符:13%5:对13除以5取模
<3>每一个表达式都有一个值:6+(c=3+8) 的值为17
<4>.完整的表达式(full exspression):while循环判断的条件是一个完整的表达式;
ans=num*2+num++中num*2和num++都不是完整是表达式。