[C学习]数据类型注意点*

强制类型转换: (类型)(表达式)

说明:在强制类型转换时,只得到一个所需类型的中间变量,而原来变量的类型并不改变.

   只强制转换距离它最近的数,如果是对表达式转换,加上括号.

自增,自减运算:

它的运算对象是标准类型,不能是表达式.--可以用于各种类型的变量.

它的运算过程是先取出这个地址里的值,再进行处理,处理完后将值存入这个地址中.如果是表达式,没有对应的地址来保存这个处理后的值.所以不能对表达式进行此运算.

如: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??????

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值