第17课 ++和--操作符分析

1. ++和—操作符对应的两条汇编指令

(1)前置++或--:变量自增(减)1,然后取变量值

(2)后置++或--:取变量值,然后变量自增(减)1

【实例分析】一对令人头疼的兄弟

#include <stdio.h>

int main()
{
    int i = 0;
    int r = 0;

    r = (i++) + (i++) + (i++);

    printf("i = %d\n", i); //i等于3
    printf("r = %d\n", r); //vc下r=0,gcc也等于0

    r = (++i) + (++i) + (++i);

    printf("i = %d\n", i); //i等于6
    printf("r = %d\n", r); //vc下r=18,gcc下等于16,java下等于15;
    return 0;
}

2. C标准对++和—运算符的规定

(1)C语言中只规定了++和—对应指令的相对执行次序(即两条汇编指令的前后顺序是有规定的,但不一定要紧紧相邻!

(2)但他们的汇编指令不一定连续运行,在混合运算中,其汇编指令可能被打断执行。(即上述两条汇编指令中间可能会被其他指令穿插进来,从而导致这两条指令不能连续、紧凑地执行)。

  ▲++和—参与混合运算,结果是不确定的。

3. 笔试面试中的“奇葩”题

4. 贪心法:++、--表达式的阅读技巧

(1)编译器处理的每个符号应该尽可能多的包含字符

(2)编译器从左到右一个字符一个字符地读入,如果该字符可能组成一个符号,那么再读入下一个字符,判断已经读入字符组成的字符串是否可能是一个符号的组成部分;如果可能,继续读入下一下字符。

(3)重复上述判断,直到读入的字符组成的字符串已不再可能组成一个有意义的符号。

(4)空格可以作为C语言中一个完整符号的休止符,当编译器读入空格后立即对之前读入的符号进行处理。

  ▲理解贪心法的关键:当读取的字符串还是一个有意义的符号(或表达式时)并不会停止读入,而是继续读入下一个字符,直至完全不再可能组成一个有意义的符号为止。

【实例分析】贪心法阅读示例

#include <stdio.h>

int main()
{
    int i = 0;

    //处理过程:读入第1个字符+,加号是有意义的,因为他可以与其他符号再组成(如组成++
    //或加另一个变量,因此读取并不会停止),于是继续读入第2个字符+,编译器发现是
    //一个自增运算符,会继续读入后面的变量i,得++i。这时这个符号仍是有意义的。
    //但根据贪心法,还会再读入一个字符,即++i+,表示++i后面
    //会加上一个数,这也是有意义的。所以会再读入第5个字符,这里发现己经读入的字符串
    //己经不再可能变成一个有意义符号。所以会停止读入字符转向去处理之前读读入的这个子
    //表达式,这时会先++i,即得到1,然后++,即1++,所以便会出错。
    int j = ++i+++i+++i;

    int a = 1;
    int b = 4;
    int c = a+++ b; //读到a++是有意义的,会再读入一个字符+,仍有意义,会再次读入b,即(a++) + b

    int* p = &a;

    b = b/*p; //读到“b/”是有意义的,因为b可以去除一个数。所以会继续读到b/*,这时发现这个
              //字符串不可能再任何意义了,所以停止读取。但b/*这个表达式是非法的,所以编译器
              //会报错。同时/*会组成多行注释的开始,所以编译会把/*会面的内容当成注意的内容。

    printf("i = %d\n", i);
    printf("j = %d\n", j);
    printf("a = %d\n", a);
    printf("b = %d\n", b);
    printf("c = %d\n", c);

    return 0;
}

5. 小结

(1)++和—操作符在混合运算中的行为可能不同

(2)编译器通过贪心法处理表达式中的子表达式

(3)空格可以作为C语言中一个完整符号的休止符

(4)编译器读入空格后立即对之前读入的符号进行处理。

时间: 2025-01-02 04:04:20

第17课 ++和--操作符分析的相关文章

3月3日完成第17课,准备开始第18课

昨天,也就是3月3日终于完成word文档"lvs+keepalived集群架构服务应用指南.doc"第17课的部分.之前,又完成1节51cto学院里,oldboy关于职业发展的视频笔记"linux运维人员需要具备的技能说明". 本来的计划是春节前完成第17课,没想到又拖成2个月. 第18课估计也不会好到那里去-- 我现在又开始纠结到底要不要进行MySQL的最后1课了,在公司根本就用不到MySQL.是不是要在换工作之前,先把4节shell课程完成再说呢? 先学能用的,

数据-第17课-栈课后练习

第17课-栈课后练习 1. 分析顺序栈和链式栈各个操作的算法时间复杂度. 2. 我们在创建顺序栈时将队尾定义为栈顶,而在创建链式栈时将队头定义为栈顶.那么我们反过来可行吗(即:顺序栈操作队头,链式栈操作队尾)?为什么? 3. 将后缀表达式的转换和计算合并为一个完整的程序,当用户输入合法的s四则运算表达式时直接给出结果. 提示: l  示例中只能处理每个数字为0—9的情况,如何扩展? l  如何判断表达式的输入是否合法? 原文地址:https://www.cnblogs.com/free-1122

C++--第17课 - 继承与多态 - 上

第17课 - 继承与多态 - 上 引入: 如果子类定义了与父类中原型相同的函数会发生什么? 1. 函数重写 在子类中定义与父类中原型相同的函数,函数重写只发生在父类与子类之间. 父类中被重写的函数依然会继承给子类,默认情况下子类中重写的函数将隐藏父类中的函数,通过作用域分辨符::可以访问到父类中被隐藏的函数. #include <cstdlib> #include <iostream> using namespace std; class Parent { public: void

第17课 - 对象的构造

第17课 - 对象的构造(上) 0. 问题 对象中成员变量的初始值是什么? 下面的类定义中成员变量 i 和 j 的初始值是什么?  对象定义在 全局空间.栈上.堆上,具有不同的属性. 1 #include <stdio.h> 2 3 class Test 4 { 5 private: 6 int i; 7 int j; 8 public: 9 int getI() { return i; } // 类成员函数,直接访问 10 int getJ() { return j; } 11 }; 12

第17课-数据库开发及ado.net 聚合函数,模糊查询like,通配符.空值处理.order by排序.分组group by-having.类型转换-cast,Convert.union all; Select 列 into 新表;字符串函数;日期函数

第17课-数据库开发及ado.net 聚合函数,模糊查询like,通配符.空值处理.order by排序.分组group by-having.类型转换-cast,Convert.union all;  Select 列 into 新表;字符串函数;日期函数 SQL聚合函数 MAX(最大值).MIN(最小值).AVG(平均值).SUM(和).COUNT(数量:记录的条数) 聚合函数对null不计算.如果一行数据都是null,count(*)包含对空值行.重复行的统计. --聚合函数演示 selec

【自动语音识别课程】第二课 语音信号分析

[传送门] [自动语音识别课程]第一课 统计语音识别介绍 原文地址:http://blog.csdn.net/joey_su/article/details/36414877 转载请注明出处,欢迎交流. 概述 针对ASR的语音信号分析 特征 频谱分析 倒谱分析 标准特征:MFCC和PLP分析 动态特征 第一课的结尾提到了语音识别的框图,下图展示了信号分析技术在语音识别系统中的位置: 我们先来认识下语音的产生过程: 语音是在发音器官和声道共同作用下产生的.说话时,声带振动发出具有一定周期特性(基音

Spark IMF传奇行动第17课Transformations实战总结

今晚听了王家林老师的Spark IMF传奇行动第17课Transformations实战,作业是用SCALA写cogroup: def main(args: Array[String]): Unit = { val sc = sparkContext("Transformations") cogroupTrans(sc) sc.stop() } def cogroupTrans(sc:SparkContext): Unit ={ val stuNames = Array( Tuple2

1月5日完成第22课,准备开始第17课

今天总算把第22课,nagios的第二部分视频看完了.3个月的时间,实在超出我的预期:之前的21课.28课,可以说是一课比一课超出我的预期.22课还比21课少半小时的视频时长,可是,学习的进度实在太慢了. 不断"挑战"自己的容忍限度,可是对自己又没有什么办法. 后天下班回来,计划开始第17课(如果明天能早起,说不定可以从明天开始.对了,后天下班回来,我还想完成51cto学院里,oldboy组织的一次运维职场发展的课程里的1节视频:"到底做运维还是做开发-听听专家的意见&quo

Python Codecademy 函数17课

def shut_down(s): if s=="yes": return "Shutting down" elif s=="no": return "Shutdown aborted" else: return"Sorry 17课这个小程序,改了好几遍,错误原因 1.关键字return打错了.(⊙﹏⊙)b 2.return后加了括号 3.用了print