运算符的运用
前置代码

语句的构成
语句是由
运算符,表达式,关键字组成的.
语句的分类
分为
赋值语句,复合语句,函数调用语句.
赋值语句中的数据对象(date object)是指的内存空间.左值:
可修改
右值:不可修改
那么, 当我们写下这句代码i += i的时候, 疑问来了.
我们的i是一个变量, 放到了右边作为右值, 不是不能修改吗? 为什么还能给i赋值呢?
通过反汇编代码我们可以知道, 在进行这句代码执行的时候, 实际上, 我们会变成如下语句:mov eax, [i]add eax, eaxmov [i], eax
可以看到, 其实我们是先进行运算, 取到 i 的值, 然后又进行的赋值.
所以, 我们的右值确实是不可改变的. 当然对左值和右值的理解, 需要我们在加强一下.连续赋值实质上, 是有优先级的, 是从右至左进行赋值操作.
实际上, 还是将语句按照一定的顺序和优先级进行分解之后分别执行的.
运算符
优先级
使用二叉树的方式进行优先级的解析.运算符的优先级,
* 和 / > + 和 -
sizeof
sizeof是一个运算符, 不是函数.
可以通过反汇编代码来验证, 在汇编代码中, 函数调用都要使用call指令
而我们观察sizeof的时候, 发现是直接计算出值的.
++ -- 操作符
都分为
前++, 前--和后++, 后--.
前++ 和 前--的情况相同, 后++ 和 后-- 的情况相同, 以下统一只说 ++ 操作符.
前++, 就是++运算符在前, 比如++i.在单独的语句中, i++和++i无区别, 最终效果都是 i 的值自增1.
而在赋值/输出等语句中时,i++可以简单的理解为, 先使用i的值, 等当前使用过1次i的值之后, i自增1.++i则可以简单理解为, 先让 i 自增1, 然后在使用i的值进行操作.
当然, 这种简单理解可以帮我们记住 前++ 和 后++ 的优先级和他们的执行效果.
但是实际上,无论是前++还是后++, i 的值都会先自增1.
不同的是,在写 i++ 的时候, i 的值在自增之前, 会先保存在一个临时变量中, 然后 i 的值自增1.
在当前语句第一次使用到 i 的值的时候, 使用的是临时变量中保存的 i 原本的值.
但是我们的 i 实际上已经被改变了.
而我们的前++, 也就是 ++i 的时候, 并不会进行保存临时变量, 而是直接拿运算后的 i 的值进行使用.
所以我们才会看到 i++ 和 ++i 的区别.
注意
一定要注意运算符之间的
优先级.
表达式
C语言中, 表达式都表示的是一个值.
表达式都是先进行计算, 然后在进行处理.
作业
1. 假设所有的变量都为 int 类型, 请写出下列各项变量中的值:
y = x = (2 + 3) / 4;
y = 4 * 8 / (xx = 2 * 8);
x = (int)3.3 + 3.111;
y = 30.0 / 4.0 * 5.0;
x = 30 / 4.0 * 5;
2. 请写出程序打印出来的值
int num = 10;
printf("%d", ++num);
printf("%d", num++);
printf("%d", ++num);
printf("%d", num--);
printf("%d", num);
3. 请写出下面程序的打印出来的结果:
#include <stdio.h>
#define LENGTH 10
int main() {
int num = 0;
while(num++ < LENGTH) {
printf("%5d", num);
}
return 0;
}
4. 编程题
1). 让用户不停的输入分钟, 程序自动换算为小时分钟的表现形式(不能出现魔数).当用户输入0或小于0时程序结束.
2). 让用户不停的输入天数, 程序自动换算为周数加天数的表现形式(不能出现魔数).当用户输入0或者小于0时程序结束.
3). 请写出一个程序, 要求用户输入:
总里程(公里)
跑过的距离(公里)
跑步用时(分钟)
请计算并显示出跑完全程还需要的时间(小时: 分钟: 秒:)
4). 看故事写程序
传说西塔发明了国际象棋而使国王十分高兴, 他决定要重赏西塔.西塔说:"我不要你的重赏, 陛下,
只要你在我的棋盘上赏一些麦子就行了.
在棋盘的第一个格子里放1粒, 在第二个格子里放2粒, 在第三个格子里放4粒, 在第四个格子里放8粒,
以此类推, 以后每个格子里放的麦粒数都是前一个格子里放的麦粒数的两倍, 直到放满第64个格子就行了".
"区区小数, 几粒麦子, 这有何难, 来人!". 国王令人如数付给西塔.
请计算最后国王需要给西塔多少粒小麦, 一共有多少吨.(假设1粒=1克)如有错误,请提出指正!谢谢.
本文由 花心胡萝卜 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: 2016-10-06 at 03:17 pm