运算符优先级

7-19 简单计算器 (20分)

牧云@^-^@ 提交于 2020-01-16 19:05:18
模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算。 输入格式: 输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。 输出格式: 在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。 输入样例: 1+2*10-10/2= 输出样例: 10 样例的数字类型是自己决定的 # include <bits/stdc++.h> using namespace std ; int main ( ) { // freopen("D:\\LYJ.txt","r",stdin); int a , res ; char c ; cin >> a ; res = a ; while ( cin >> c ) { if ( c == '+' ) { cin >> a ; res + = a ; } else if ( c == '-' ) { cin >> a ; res - = a ; } else if ( c == '*' ) { cin >> a ; res * = a ; } else if ( c == '/' ) { cin >> a ; if ( 0 == a ) { cout << "ERROR" ; return 0 ; } res /

java 运算符 数据类型的引用 流程控制语句

断了今生、忘了曾经 提交于 2020-01-15 02:00:35
赋值运算符 = 赋值 +=加后赋值 -=减后赋值 *=乘后赋值 /=除后赋值 %=取余后赋值 a+=2 类似于a=a+2 其他一样 比较运算符 ==等于 !=不等于 <小于 >大于 <=小于等于 >=大于等于 逻辑运算符 & 与 | 或 ^异或 !非 &&短路与 ||短路非 短路与&&:参与运算的两边数据,有false,则运算结果为false; 短路或||:参与运算的两边数据,有true,则运算结果为true; 逻辑非! : 参与运算的数据,原先是true则变成false,原先是false则变成true。 异或^ 两边相同为false 不同为true 对于&&,如果第一个值为false,那么第二个不再计算,如果第一个值为true,那么还要计算第二个值; 对于||,若果第一个值为false,那么还要计算第二个值,如果第一个值为true,那么第二个值不会计算; 对于&和|操作符,两边无论如何都计算。 三元运算符 格式 (条件表达式)?表达式1:表达式2; 运算规则 先判断条件表达式的值,若为true,运算结果为表达式1;若为false,运算结果为表达式2。 运算优先级 括号>正负号>自增自减,非>乘除,取余>加减>移位运算>大小关系>相等关系>按位与>按位异或>按位或>逻辑与>逻辑或>条件运算>赋值运算>位赋值运算 引用数据类型 在使用时先导包,import java.util.类

C/C++对运算符重载详解

余生颓废 提交于 2020-01-14 12:27:12
下面来进行这段代码的分析: struct node { //定义一个结构体node(节点) int x; int y; int len; //node中有3个成员变量x,y,len bool operator <( const node &a) const { //重载<操作符。可以对两个node使用<操作符进行比较 return len<a.len; } }; 括号中的const表示参数a对象不会被修改,最后的const表明调用函数对象不会被修改! 想必看到这里对重载运算符算是有一丁点的了解吧,下面看些理论文字,更加清楚的了解关系! Return Top 重载运算符的介绍 C++中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作。运算符重载的实质是函数重载,它提供了C++的可扩展性,也是C++最吸引人的特性之一。   运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运算符将要进行的操作。运算符函数的定义与其他函数的定义类似,惟一的区别是运算符函数的函数名是由关键字operator和其后要重载的运算符符号构成的。运算符函数定义的一般格式如下: <返回类型说明符> operator <运算符符号>(<参数表>) {

编译原理 语义分析

故事扮演 提交于 2020-01-14 02:28:20
文章目录 1. 语义与语法的区别 重点:语义分析的两个作用 <3> 语义分析的方法 2. 中间代码 重点:要求中间代码具有如下特性,以便于编译器的开发移植和代码的优化: 3.后缀式 定义 算法实现 4.后缀式的计算 5.三地址码 6.四元式主要由四部分组成: 三地址代码 例题有文法 G 和 G 的语法制导翻译如下: 7.符号表 8. 数组元素的引用 9. 布尔表达式 10. 控制语句 11.过程的定义与声明 左值和右值 拉链回填 1. 语义与语法的区别 <1> 语法与语义的关系 语法是指语言的结构、即语言的“样子”;语义是指附着于语言结构上的实际含意 ,即语言的“意义”。 对于语法和语义: 语义不能离开语法独立存在; 语义远比语法复杂; 同一语言结构可包含多种含意,不同语言结构可表示相同含意; 语法与语义之间没有明确的界线。 重点:语义分析的两个作用 1.检查是否结构正确的句子所表示的意思也合法; 2.执行规定的语义动作,如: 表达式求值 符号表填写 中间代码生成等 <3> 语义分析的方法 语法制导翻译 2. 中间代码 重点:要求中间代码具有如下特性,以便于编译器的开发移植和代码的优化: 便于语法制导翻译; 既与机器指令的结构相近,又与具体机器无关。 3.后缀式 定义 一个表达式E的后缀形式可以如下定义: (1)如果E是一个变量或常量,则E的后缀式是E本身。 (2)如果E是E1

Chapter 3、Java语法基础(三)--- 运算符、数据类型转换 (22nd,Feb)

我怕爱的太早我们不能终老 提交于 2020-01-13 06:31:47
运算符 1、含义: 一些特殊的符号,主要用于数学函数、一些类型的赋值语句和逻辑比较方面。 2、种类: 赋值运算符( = ) 算术运算符( + ,—, * , / , % ) 自增自减运算符( ++ , -- ) 比较运算符( >,<,>=,<=,==,!= ):运算结果 boolean 型( true , false ) 逻辑运算符( & , | ,!):操作元为 boolean 型数据 注:除了逻辑(!)运算符是一元运算符以外,其他都是二元运算符 三元运算符(?:) 3、运算符优先级 运算符不同:下图 运算符相同:从左到右 优先级 描述 运算符 1 括号 () 2 正负号 + , - 3 一元运算符 ++ , -- ,! 4 乘除 * , / , % 5 加减 + , - 6 移位运算 >>,<<,>=,<= 7 比较大小 <,>,>=,<= 8 比较是否相等 ==,!= 9 按位与运算 & 10 按位或运算 ^ 11 按位或运算 | 12 逻辑与运算 && 13 逻辑或运算 || 14 三元运算符 ?: 15 赋值运算符 = 数据类型转换 1、隐式转换(自动转换) :自动从范围小的转换为范围大的类型 2、强制转换(显示转换) :强制从范围小的转换为范围大的类型 3、前提条件:数据类型兼容 注释 1、单行: // 2、多行 : ctrl+/ /* */ 3、文档 : /** **

前缀、中缀、后缀表达式

守給你的承諾、 提交于 2020-01-13 02:23:09
它们 都 是对表达式的记法,因此也被称为前缀记法、中缀记法和后缀记法。它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式 的运算符位于与其相 关的操作数之前;中缀和后缀同理。 举例: (3 + 4) × 5 - 6 就是中缀表达式 - × + 3 4 5 6 前缀表达式 3 4 + 5 × 6 - 后缀表达式 一、中缀表达式(中缀记法) 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间。 中缀表达式是人们常用的算术表示方法。 虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值。 对计算机来说,计算前缀或后缀表达式的值非常简单。 二、前缀表达式(前缀记法、波兰式) 前缀表达式的 运算符位于两个相应操作数之前。 前缀表达式的计算机求值:(相当于转换成了中缀表达式) 从右至左扫描表达式 ,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。 例如前缀表达式“- × + 3 4 5 6”: (1) 从右至左扫描,将6、5、4、3压入堆栈; (2) 遇到+运算符,因此弹出3和4(3为栈顶元素,4为次顶元素

前缀、中缀、后缀表达式以及简单计算器的C++实现

两盒软妹~` 提交于 2020-01-12 13:46:24
前缀表达式(波兰表达式)、中缀表达式、后缀表达式(逆波兰表达式) 介绍   三种表达式都是 四则运算的表达方式,用以四则运算表达式求值,即数学表达式的求解。 前缀表达式 前缀表达式是一种没有括号的算术表达式,与中缀表达式不同的是,其将运算符写在前面,操作数写在后面。为纪念其发明者波兰数学家Jan Lukasiewicz,前缀表达式也称为“波兰式”。例如,- 1 + 2 3,它等价于1-(2+3)。 中缀表达式 中缀表达式就是一般的算数表达式,操作符以中缀形式出现在操作数之间。 后缀表达式 后缀表达式指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则)。 中缀表达式转前缀表达式   例如:对于中缀表达式 (3+4)×5-6 ,其前缀表达式为 - × + 3 4 5 6 。前后缀表达式与中缀之间的转换关系,不在此赘述,在 Seraphjin 的博客中,通过二叉树的方式,很好地解释了这一内容。 除了该博客中所说的二叉树法,还可以通过栈方法,来实现二者的转换,具体步骤如下: 初始化两个栈:运算符栈S1和储存中间结果的栈S2; 从右至左扫描中缀表达式; 遇到操作数时,将其压入S2; 遇到运算符时,比较其与S1栈顶运算符的优先级: 如果S1为空,或栈顶运算符为右括号“)”,则直接将此运算符入栈; 否则

第16课 位运算符分析

偶尔善良 提交于 2020-01-11 20:46:28
1. C 语言中的位运算符——直接对bit位进行操作,效率最高 & 按位与 | 按位或 ^ 按位异或 ~ 取反 << 左移 >> 右移 2. 左移和右移注意点 (1)左 操作数 必须为整型类型:char和short被隐式转换为int后进行移位操作 (2)右 操作数 的范围必须为: [0,31]。其他值属未定义行为,不同编译器处理不同。 (3)左移 运算符 << 将运算数的二进制位左移:规则为高位丢弃, 低位补0 (4)右移 运算符 >> 把运算数的二进制位左移:规则为 高位补符号 ,低位丢弃 3. 有趣的问题:0x1 << 2 + 3 的值会是什么? 【实例分析】位运算符初探 #include <stdio.h> int main() { printf("%d\n", 3 << 2); //3<<2 ===> 0x11<<2 ===>1100,即12 printf("%d\n", 3 >> 1); //0x11<<1, 即1 printf("%d\n", -1 >> 1);//0x1111>>1 ,即0x1111,仍为1 printf("%d\n", 0x01 << 2 + 3);//相当于0x01<<(2+3),即32 printf("%d\n", 3 << -1); // oops!右操作数必须为[0,31],不同编译器处理方式不同 return 0; } 4. 小贴士—

Java面试题26——运算符优先级

故事扮演 提交于 2020-01-11 08:48:36
运算符优先级 1.Java中的运算符优先级: 口诀:单目乘除为关系,逻辑三目后赋值。(大佬总结的) 口诀解释: 单目:指的是例如正负(±)这些一次只作用于一个变量的运算符,又叫一元运算符。 乘除:乘、除、模 ,毫无疑问优先级比加减高一级 为:即谐音“位”,指的是位运算中用到的符号:~(按位取反)<<(左移) >>(右移),^(也可以位运算,二进制异或)。 关系:大于、大于等于、小于、小于等于 逻辑:指的是异或、与、或三个逻辑运算符 三目:即三目运算符:条件运算符A > B ? X : Y 赋值:赋值运算符 具体的运算符排序如下:可以看到与我们的口诀不同的是,位运算符(按位与、按位或、按位异或)优先级排在关系运算符的后面。但是>>,<<,>>>等位运算符在关系运算符前面。~(按位取反)优先级很高。 这里的结合性是指运算符结合的顺序,通常都是从左到右。从右向左的运算符最典型的就是负号,例如3±4,则意义为3加-4,符号首先和运算符右侧的内容结合。 来源: CSDN 作者: 子衿@ 链接: https://blog.csdn.net/huiyanfreeflying/article/details/103914219

数据结构——栈(中缀表达式转前缀表达式)

為{幸葍}努か 提交于 2020-01-11 00:58:41
接上篇 数据结构——栈(中缀表达式转后缀表达式) 这里再做一个前缀表达式的总结: 初始化两个栈:运算符栈S1和储存中间结果的栈S2; 从 右至左 扫描中缀表达式; 遇到操作数时,将其压入S2; 遇到 运算符 时,比较其与S1栈顶运算符的优先级: 4.1 如果 S1为空或栈顶运算符为右括号“)” ,则直接将此运算符入栈; 4.2 否则,若优先级比栈顶运算符的 较高或相等 ,也将运算符压入S1; 4.3 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较; 遇到括号时: 5.1 如果是 右括号“)” ,则直接压入S1; 5.2 如果是左括号“(”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到右括号为止,此时将这一对括号丢弃( 注意栈顶右括号的舍弃 ); 重复步骤(2)至(5),直到表达式的最左边; 将S1中剩余的运算符依次弹出并压入S2; 依次弹出S2中的元素并输出,结果即为中缀表达式对应的前缀表达式。 代码示例:表达式→逆向列表→前缀表达式右→计算结果(操作符优先级获取、计算结果获取位于 上一篇博客 中) 根据表达式获取列表(由于逆向扫描,直接将表达式转成逆向列表) private static List < String > toPrefixExpressionList ( String expresion ) { if (