c语言sizeof用法_一个需要戴好头盔再开始读的C语言笔记

程序员的武器:键盘

首先,来看一道题

1.若有定义: int b=7; float a=2.5,c=4.7;则以下表达式的值为: ______
a+(int)(b/3*(int)(a+c)/2)%4
2.
result = 2;
result = ( result = result * 2 ) * 6 * ( result = 3 + result );
请问result的值再计算后是多少?

第一题的答案是5.5,第二题的答案是168。

设想一个情景,你写的程序有如上的代码,然后交给你的同事…………

同事读到这一行的时候,反手抄起手边IQUNIX全铝外壳的键盘向你的头砸来…………

玩笑话到此结束,这两道题虽然有严重的可读性差的问题,但是……作为一个刚学c语言的菜鸟,这样的训练一方面可以让我们记住表达式的逻辑和顺序,同时也可以让我们从此养成诅咒出题老师的好习惯(bushi)。

算符列表

以下是来自菜鸟教程的运算符优先级列表

类别运算符结合性
后缀`() [] -> . ++ --`从左到右
一元`+ - ! ~ ++ -- (type)* & sizeof `从右到左
乘除`* / % `从左到右
加减`+ - `从左到右
移位`<< >> `从左到右
关系`< <= > >= `从左到右
相等`== != `从左到右
位与 AND`& `从左到右
位异或 XOR^从左到右
位或 OR`| `从左到右
逻辑与 AND`&&`从左到右
逻辑或 OR`|| `从左到右
条件`?: `从右到左
赋值`= += -= *= /= %=>>= <<= &= ^= |= `从右到左
逗号`, `从左到右

其中每个运算符的作用不再赘述。以上的运算符中主要用到的大体分为三类:

  • 算术运算符
  • 关系运算符
  • 逻辑运算符

这三者的优先级为算术运算符>关系运算符>逻辑运算符。

剩下的为

  • 位运算符
  • 赋值运算符
  • 杂项运算符

所谓的实战

已知:b=2, c=3, d=4, e=5, f=2

求执行以下表达式后,a的值

a = b+= c++-d+--e/-f

逐步分析:

  1. 将其中所有运算按类型分好并排序
后缀 ++
一元 - --
乘除 /
加减 +
赋值 =
  1. 逐一计算
    1. c++c的值在执行完此语句后变为4
    2. -f值为-2,-d的值为-4,--e为4
    3. --e/-f为-2
    4. 最右端的=后,所有的加减运算结果为-1
    5. a=b,a=-1

答案是-1。

一斤鸭梨!

但是,此语句中存在一个极易引起歧义的点c++。引用一段来自C Primer Plus的话:

还有一种情况,也不确定:
n = 3;
y = n++ + n++;
可以肯定的是,执行完这两条语句后,n的值会比旧值大2。但是,y的值不确定。在对y求值时,编译器可以使用n的旧值(3)两次,然后把n递增 1两次,这使得y的值为6,n的值为5。或者,编译器使用n的旧值(3)一次,立即递增n,再对表达式中的第2个n使用递增后的新值,然后再递增n, 这使得 y 的值为 7,n 的值为 5。两种方案都可行。对于这种情况更精确地说,结果是未定义的,这意味着 C标准并未定义结果应该是什么。

所以,即便你已经完全掌握了c语言的运算符运算法则,也不建议你在实际操作中使用这种奇葩的一连串的用法,即便这对c是合法的。除非,你在办公室里也不摘下电动车的头盔。


感谢阅读~也欢迎各位来我的博客玩耍~

链接:Aldehyde's blog

昨天刚刚搭建好的,比较粗糙…………orz

感谢各位的支持!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值