Lesson18 PoEdu培训第二课 C语言篇(10) 运算符的使用
文章类别: 培训笔记 0 评论

Lesson18 PoEdu培训第二课 C语言篇(10) 运算符的使用

文章类别: 培训笔记 0 评论

运算符的运用

前置代码

Alt 前置代码

语句的构成

语句是由运算符, 表达式, 关键字组成的.

语句的分类

分为赋值语句, 复合语句, 函数调用语句.
赋值语句中的数据对象(date object)是指的内存空间.

左值: 可修改
右值: 不可修改
那么, 当我们写下这句代码 i += i 的时候, 疑问来了.
我们的i是一个变量, 放到了右边作为右值, 不是不能修改吗? 为什么还能给i赋值呢?
通过反汇编代码我们可以知道, 在进行这句代码执行的时候, 实际上, 我们会变成如下语句:
mov eax, [i]
add eax, eax
mov [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克)

如有错误,请提出指正!谢谢.

回复