zoukankan      html  css  js  c++  java
  • 词法分析——运算符的解析

    这篇文章主要讲的是《C陷阱与缺陷》中第一章习题1-3与1-4。

    习题1-3:为什么n-->0的含义是n-- > 0,而不是n- -> 0 ?

    习题1-4:a+++++b的含义是什么?

    在回答这两个题目之前,我们先回顾下1.3节的内容,该节主要讲的是词法分析中的”贪心算法“:

    编译器将程序分解成符号的方法是:从左到右一个字符一个字符的读入,如果该字符可能组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分;如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串已经不再可能组成一个有意义的符号。这个处理策略被称为“贪心法”或者“大嘴法”。

    通过优先级表查找,我们知道->的优先级高于--,所以,如果按照优先级策略,对于1-3表达式n-->0应该表达的是n- -> 0而不是n-- > 0!

    ++的优先级高于+,对于1-4的含义可能被理解成(a++) + (++b),而不是((a++)++)+。

    但是有了词法分析原理后,我们就能理解表达式n-->0为啥是n-- >0,而不是n- ->0了。因为从左至右,先判断的是--符号。同理a+++++b的含义是((a++)++)+。

    对于1-4题,还涉及到左值与右值的概念,通过编译会发现a+++++b编译出错!

    错误提示:lvalue required as increment operand(增操作数必须是左值。使用vs提示error C2105: “++”需要左值)

    左值与右值含义:左值就是可以在"="左边,能被赋予值的东西;右值则是在"="右边,可以赋值给别人的东西。所以左值必须是有内存空间的东西;而右值则既可以是变量,也可是常量和某种表达式,只要能提供一个值即可

     

    C++ PRIMER自增和自减操作符讲解:

    int i =0, j;
    j = ++i; // j = 1, i = 1
    j = i++; // j = 1, i = 2

    前置操作符返回加1后的值,所以返回对象本身,这是左值;后置操作符返回的则是右值,即是它的一个副本;

    词法分析,a+++++b=((a++)++)+b,(a++)返回的是右值,而(a++)++没有提供左值存放的空间,故编译器会提示错误!

    其他示例:对于++a+++b,同样会报错,原因是:++运算符是从右到左结合,故计算顺序为(++(a++))+b,同样a++为右值,不能作为左值出现!

    而例子:(++a)+++b,则可以计算!

  • 相关阅读:
    Java位运算总结-leetcode题目
    【Java心得总结七】Java容器下——Map
    【Java心得总结六】Java容器中——Collection
    【Java心得总结五】Java容器上——容器初探
    【Java心得总结四】Java泛型下——万恶的擦除
    【Java心得总结三】Java泛型上——初识泛型
    【Java心得总结二】浅谈Java中的异常
    Opencv摄像头实时人脸识别
    【Java心得总结一】Java基本类型和包装类型解析
    Opencv VideoCapture实时捕捉摄像头信息
  • 原文地址:https://www.cnblogs.com/liuxiaoming/p/2637069.html
Copyright © 2011-2022 走看看