强制类型转换: (类型)(表达式)
说明:在强制类型转换时,只得到一个所需类型的中间变量,而原来变量的类型并不改变.
只强制转换距离它最近的数,如果是对表达式转换,加上括号.
自增,自减运算:
它的运算对象是标准类型,不能是表达式.--可以用于各种类型的变量.
它的运算过程是先取出这个地址里的值,再进行处理,处理完后将值存入这个地址中.如果是表达式,没有对应的地址来保存这个处理后的值.所以不能对表达式进行此运算.
如:int i=3;
i++*++i+i--*--i=?//++;--运算优先级高于算术运算
(i++)*(++i)+(i--)*(--i)=?;//先找到所有的前缀,计算后将值放入变量地址中
1 1
4 2//然后计算表达式的值,对于后缀,可先不处理
3*4+3*2=18;
对于表达式中所有的变量都会申请一个临时的地址,上例中的i不是只有一个地址,只有每一个i对应一个.
如X=X+1;右边的X也是要申请地址计算后再将值赋给左边的.它的执行过程为:读右边X的地址;X+1;读左边的地址;将右值赋给左边的X(编译器不认为左右X的地址相同)
前缀:在算术表达式开始前,给所有的前缀都处理.
后缀:在算术表达式结束后,再对所有的后缀处理.
注意:有关表达式的说明
C的运算符有时为一个字符,有时由两个字符组成.C系统处理时尽可能的(由左至右)最大可能的结合成一个运算符.如i+++j;处理为(i++)+j;
在调用函数时,实参的求值顺序,如printf("%d%d",i,i++);它的求值顺序是由右至左的,函数的调用都是用栈,先将表达式压入,再弹出取值,取出一个生效一个,与表达式中同时给初值不同,它是谁先弹出,这个变量的值就已经改变.(也可理解为表达式是在同一个式中,而用作参数时,是用逗号分开的",").
补充一个例子:
int i=3;
int k=(i++)*(++i)+(i--)*(--i);//3*4+3*2=18;
printf("%d,%d",k,(i++)*(++i)+(i--)*(--i));//18,30?????????????//3*5+5*3=30
-----------------------------------------------------------还是要说一句,这个地方真是恶心,写着写着就没有了------------------
a=5;a=(a--)+3;b=5;
printf("%d,%d,%d,%d",a,b,b=(b--)+3,b);//7,8,8,5???????????????????
<-----------------------
4 3 2 1
函数参数,在调用函数时将参数放入堆栈中
b |
b=(b--)+3 |
b |
a |
1,先弹出b.b为5.
2.作b--,b--的值为5,而b就变为4,最后赋值时,又将(b--)+3//5+3=8的值又放在b中,将刚给的4给覆盖了b变为8
b的过程如下所示:
5 |
4 |
5+3=8 |
3.b为8.
4.a为7,它是一个表达式,是先5+3给了a,再后缀运算,a--,为7
--------------崩溃的就是,在.NET中运行结果不是这么回事.
18,18/7,7,8,7??????