c++自底向上算符优先分析_C++运算符优先级和结合性

C++运算符优先级表,从上到下,从左到右,优先级依次减弱。

优先级运算符说明结合性
1::范围解析自左向右
2++  --后缀自增/后缀自减
()括号
[]数组下标
.成员选择(对象)
−>成员选择(指针)
3++  --前缀自增/前缀自减自右向左
+  −加/减
!  ~逻辑非/按位取反
(type)强制类型转换
*取指针指向的值
&某某的地址
sizeof某某的大小
new,new[]动态内存分配/动态数组内存分配
delete,delete[]动态内存释放/动态数组内存释放
4.*  ->*成员对象选择/成员指针选择自左向右
5*  /   %乘法/除法/取余
6+  −加号/减号
7<>位左移/位右移
8小于/小于等于
>  >=大于/大于等于
9==  !=等于/不等于
10&按位与
11^按位异或
12|按位或
13&&与运算
14||或运算
15?:三目运算符自右向左
16=赋值
+=  −=相加后赋值/相减后赋值
*=  /=   %=相乘后赋值/相除后赋值/取余后赋值
<<=  >>=位左移赋值/位右移赋值
&=  ^=  |=位与运算后赋值/位异或运算后赋值/位或运算后赋值
17throw抛出异常
18,逗号自左向右

C++中的运算符和运算符优先级总结

一、算术运算符

下表显示了 C++ 支持的所有算术运算符。假设变量 A 的值为 10,变量 B 的值为 20,则:

运算符描述实例
+把两个操作数相加A+B将得到30
-从第一个操作数中减去第二个操作数A-B将得到-10
*把两个操作数相乘A*B将得到200
/分子除以分母B/A将得到2
%取模运算符,整除后的余数B%A将得到0
++自增运算符,整数值增加1A++将得到11
--自减运算符,整数值减少1A--将得到9

算术运算符实例:

请看下面的实例,了解 C++ 中所有可用的算术运算符,复制并黏贴下面的 C++ 程序到 test.cpp 文件中,编译并运行程序即可。

#include

using namespace std;

main()

{

 int a = 21;

 int b = 10;

 int c ;

 c = a + b;

 cout << "Line 1 - c 的值是 " << c << endl ;

 c = a - b;

 cout << "Line 2 - c 的值是 " << c << endl ;

 c = a * b;

 cout << "Line 3 - c 的值是 " << c << endl ;

 c = a / b;

 cout << "Line 4 - c 的值是 " << c << endl ;

 c = a % b;

 cout << "Line 5 - c 的值是 " << c << endl ;

 c = a++;

 cout << "Line 6 - c 的值是 " << c << endl ;

 c = a--;

 cout << "Line 7 - c 的值是 " << c << endl ;

 return 0;

}     

当上面的代码被编译和执行时,它会产生下列结果:

Line 1 - c 的值是 31

Line 2 - c 的值是 11

Line 3 - c 的值是 210

Line 4 - c 的值是 2

Line 5 - c 的值是 1

Line 6 - c 的值是 21

Line 7 - c 的值是 22

}     

二、关系运算符

下表显示了 C++ 支持的所有关系运算符。同样还是假设变量 A 的值为 10,变量 B 的值为 20,则:

关系运算符实例:

请看下面的实例,了解 C++ 中所有可用的关系运算符,复制并黏贴下面的 C++ 程序到 test.cpp 文件中,编译并运行程序即可。

#include

using namespace std;

main()

{

 int a = 21;

 int b = 10;

 int c ;

 if( a == b )

 {

  cout << "Line 1 - a 等于 b" << endl ;

 }

 else

 {

  cout << "Line 1 - a 不等于 b" << endl ;

 }

 if ( a < b )

 {

  cout << "Line 2 - a 小于 b" << endl ;

 }

 else

 {

  cout << "Line 2 - a 不小于 b" << endl ;

 }

 if ( a > b )

 {

  cout << "Line 3 - a 大于 b" << endl ;

 }

 else

 {

  cout << "Line 3 - a 不大于 b" << endl ;

 }

 /* 改变 a 和 b 的值 */

 a = 5;

 b = 20;

 if ( a <= b )

 {

  cout << "Line 4 - a 小于或等于 b" << endl ;

 }

 if ( b >= a )

 {

  cout << "Line 5 - b 大于或等于 b" << endl ;

 }

 return 0;

}

当上面的代码被编译和执行时,它会产生下列结果:

Line 1 - a 不等于 b

Line 2 - a 不小于 b

Line 3 - a 大于 b

Line 4 - a 小于或等于 b

Line 5 - b 大于或等于 b

三、逻辑运算符

下表显示了 C++ 支持的所有关系逻辑运算符。假设变量 A 的值为 1,变量 B 的值为 0,则:

逻辑运算符实例:

请看下面的实例,了解 C++ 中所有可用的逻辑运算符,复制并黏贴下面的 C++ 程序到 test.cpp 文件中,编译并运行程序即可。

#include

using namespace std;

main()

{

 int a = 5;

 int b = 20;

 int c ;

 if ( a && b )

 {

  cout << "Line 1 - 条件为真"<< endl ;

 }

 if ( a || b )

 {

  cout << "Line 2 - 条件为真"<< endl ;

 }

 /* 改变 a 和 b 的值 */

 a = 0;

 b = 10;

 if ( a && b )

 {

  cout << "Line 3 - 条件为真"<< endl ;

 }

 else

 {

  cout << "Line 4 - 条件不为真"<< endl ;

 }

 if ( !(a && b) )

 {

  cout << "Line 5 - 条件为真"<< endl ;

 }

 return 0;

}

当上面的代码被编译和执行时,它会产生下列结果:

Line 1 - 条件为真

Line 2 - 条件为真

Line 3 - 条件不为真

Line 4 - 条件为真

四、位运算符

位运算符作用于位,并逐位执行操作。&、 | 和 ^ 的真值表如下所示:

pqp&qp|qp^q
00000
01011
11110
10011

假设如果 A = 60,且 B = 13,现在以二进制格式表示,它们如下所示:

A = 0011 1100

B = 0000 1101

-----------------

A&B = 0000 1100

A|B = 0011 1101

A^B = 0011 0001

~A = 1100 0011

下表显示了 C++ 支持的位运算符。假设变量 A 的值为 60,变量 B 的值为 13,则:

运算符描述实例
&如果同时存在于两个操作数中,二进制AND运算符复制一位到结果中。(A&B)将得到12,即为0000 1100
|如果存在于任一操作数中,二进制OR运算符复制一位到结果中。(A|B)将得到61,即为0011 1101
^如果存在于其中一个操作数中但不同时存在于两个操作数中,二进制
异或运算符复制一位到结果中。
(A^B)将得到49,即为0011 0001
~二进制补码运算符是一元运算符,具有"翻转"位效果。(~A)将得到-61,即为1100 0011,2的补码形式,带符号的二进制数。
<<二进制左移运算符。左操作数的值向左移动右操作数指定的位数。A<<2将得到240,即为1111 0000
>>二进制右移运算符。左操作数的值向右移动右操作数指定的位数。A>>2将得到15,即为0000 1111

运算符实例:

请看下面的实例,了解 C++ 中所有可用的逻辑运算符,复制并黏贴下面的 C++ 程序到 test.cpp 文件中,编译并运行程序即可。

#include

using namespace std;

main()

{

 unsigned int a = 60; // 60 = 0011 1100 

 unsigned int b = 13; // 13 = 0000 1101

 int c = 0;   

 c = a & b;    // 12 = 0000 1100

 cout << "Line 1 - c 的值是 " << c << endl ;

 c = a | b;    // 61 = 0011 1101

 cout << "Line 2 - c 的值是 " << c << endl ;

 c = a ^ b;    // 49 = 0011 0001

 cout << "Line 3 - c 的值是 " << c << endl ;

 c = ~a;    // -61 = 1100 0011

 cout << "Line 4 - c 的值是 " << c << endl ;

 c = a << 2;   // 240 = 1111 0000

 cout << "Line 5 - c 的值是 " << c << endl ;

 c = a >> 2;   // 15 = 0000 1111

 cout << "Line 6 - c 的值是 " << c << endl ;

 return 0;

}

当上面的代码被编译和执行时,它会产生下列结果:

Line 1 - c 的值是 12

Line 2 - c 的值是 61

Line 3 - c 的值是 49

Line 4 - c 的值是 -61

Line 5 - c 的值是 240

Line 6 - c 的值是 15

五、赋值运算符

下表列出了 C++ 支持的赋值运算符:

运算符描述实例
=简单的赋值运算符,把右边操作数的值赋给左边操作数C=A+B将把A+B的值赋给C
+=加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数C+=A相当于C=C+A
-=减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数C-=A相当于C=C-A
*=乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数C=A相当于C=CA
/=除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数C/=A相当于C=C/A
%=求模且赋值运算符,求两个操作数的模赋值给左边操作数C%=A相当于C=C%A
<<=左移且赋值运算符C<<=2等同于C=C<<2
>>=右移且赋值运算符C>>=2等同于C=C>>2
&=按位与且赋值运算符C&=2等同于C=C&2
^=按位异或且赋值运算符C^=2等同于C=C^2
|=按位或且赋值运算符C|=2等同于C=C|2

赋值运算符实例:

请看下面的实例,了解 C++ 中所有可用的赋值运算符,复制并黏贴下面的 C++ 程序到 test.cpp 文件中,编译并运行程序即可。

#include

using namespace std;

main()

{

 int a = 21;

 int c ;

 c = a;

 cout << "Line 1 - = 运算符实例,c 的值 = : " <

 c += a;

 cout << "Line 2 - += 运算符实例,c 的值 = : " <

 c -= a;

 cout << "Line 3 - -= 运算符实例,c 的值 = : " <

 c *= a;

 cout << "Line 4 - *= 运算符实例,c 的值 = : " <

 c /= a;

 cout << "Line 5 - /= 运算符实例,c 的值 = : " <

 c = 200;

 c %= a;

 cout << "Line 6 - %= 运算符实例,c 的值 = : " <

 c <<= 2;

 cout << "Line 7 - <<= 运算符实例,c 的值 = : " <

 c >>= 2;

 cout << "Line 8 - >>= 运算符实例,c 的值 = : " <

 c &= 2;

 cout << "Line 9 - &= 运算符实例,c 的值 = : " <

 c ^= 2;

 cout << "Line 10 - ^= 运算符实例,c 的值 = : " <

 c |= 2;

 cout << "Line 11 - |= 运算符实例,c 的值 = : " <

 return 0;

}

当上面的代码被编译和执行时,它会产生下列结果:

Line 1 - = 运算符实例,c 的值 = 21

Line 2 - += 运算符实例,c 的值 = 42

Line 3 - -= 运算符实例,c 的值 = 21

Line 4 - *= 运算符实例,c 的值 = 441

Line 5 - /= 运算符实例,c 的值 = 21

Line 6 - %= 运算符实例,c 的值 = 11

Line 7 - <<= 运算符实例,c 的值 = 44

Line 8 - >>= 运算符实例,c 的值 = 11

Line 9 - &= 运算符实例,c 的值 = 2

Line 10 - ^= 运算符实例,c 的值 = 0

Line 11 - |= 运算符实例,c 的值 = 2

六、杂项运算符

下表列出了 C++ 支持的其他一些重要的杂项运算符。

杂项运算符实例:

请看下面的实例,了解 C++ 中运算符的优先级,复制并黏贴下面的 C++ 程序到 test.cpp 文件中,编译并运行程序即可。

对比有括号和没有括号时的区别,这将产生不同的结果。因为 ()、 /、 * 和 + 有不同的优先级,高优先级的操作符将优先计算。

#include

using namespace std;

main()

{

 int a = 20;

 int b = 10;

 int c = 15;

 int d = 5;

 int e;

 e = (a + b) * c / d;  // ( 30 * 15 ) / 5

 cout << "(a + b) * c / d 的值是 " << e << endl ;

 e = ((a + b) * c) / d; // (30 * 15 ) / 5

 cout << "((a + b) * c) / d 的值是 " << e << endl ;

 e = (a + b) * (c / d); // (30) * (15/5)

 cout << "(a + b) * (c / d) 的值是 " << e << endl ;

 e = a + (b * c) / d;  // 20 + (150/5)

 cout << "a + (b * c) / d 的值是 " << e << endl ;

 return 0;

}

当上面的代码被编译和执行时,它会产生下列结果:

(a + b) * c / d 的值是 90

((a + b) * c) / d 的值是 90

(a + b) * (c / d) 的值是 90

a + (b * c) / d 的值是 50

其他参考:

https://baike.baidu.com/item/%E8%BF%90%E7%AE%97%E7%AC%A6%E4%BC%98%E5%85%88%E7%BA%A7/4752611?fr=aladdin


学习编程,请到:http://www.fatanxi.com/training/index.htm

关注公众号“编程天地”,进一步了解如何学习编程语言:

93e8c0d0a55db4ed00687fd0fb4cd2c9.png

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
算符优先分析文法是一种工具,在编译的过程中,隶属于语法分析环节,却又与中间代码的生成息息相关,编译可以分为五个阶段:词法分析、语法分析、语义分析(中间代码的生成)、代码优化、目标代码生成。语法分析是指:在词法分析基础上,将单词符号串转化为语法单位(语法范畴)(短语、子句、句子、程序段、程序),并确定整个输入串是否构成语法上正确的程序。也就是说语法分析是检验输入串的语法是否正确,注意这里的语法正确,只是简单地符合自己定义的规范,而不能检测出运行时错误,比如"X/0",空指针错误,对象未初始化等错误。在这一个实验中,我将通过算符优先分析文法这一个工具,在语法分析的时候,顺便进行语义分析,也就是识别出语法单位,同时简要的将识别出的中间代码进行计算(目标代码的生成+运行),得到相应的结果,来检验自己设计的正确性。可以说题目虽然叫做算符优先分析文法,其实却是一个贯穿了“词法分析+语法分析+语义分析+中间代码优化+目标代码生成+运行”全过程的一个极具概括性的程序。如果能将这个程序得心应手的完成出来,我相信诸位对编译原理的掌握也算是炉火纯青了。时隔将近两年再来整理自己以前写过的实验报告,还是挺有感慨的,对一件东西感兴趣,原来影响还会如此深远,还记得自己当时连续六个小时全神贯注写出的实验报告,现在看看竟然写了五六十页,核心内容也有三四十页,不觉的感慨当年充满热情的时代慢慢的竟走出许久
算符优先分析C++ 编译原理 运行环境:Visual Studio 2005 #include "SStack.h" #include <iostream> #include <string> using namespace std; class Functor { private : char ** table; string ** production; string prog;//待分析字符串 int p;//字符指针 int num;//终结符个数 int num1;//产生式个数 SStack <char> stack; public: Functor(int m,int n,char ** T,string **prod,string pr) { num=m; num1=n; table=T; production=prod; prog=pr; p=0; stack.push('$'); } void traversal() { while(p<(prog.length())) { stack.display(); cout<<prog.substr(p)<<" "; char ch; if(Getnum(stack.gettop())) { ch=stack.gettop(); } else { ch=stack.getsecond(); } switch(compare(ch,prog[p])) { case 1: case 2:stack.push(prog[p]);p++;cout<<"移入"<<endl;break; case 3:reduct();cout<<"归约"<<endl;break; } } cout<<"分析成功!"<<endl; } int Getnum(char ch) { for(int i=1;i<num;i++) { if(ch==table[i][0]) { return i; } } return 0; } int compare(char col,char row) { int c=Getnum(col); int r=Getnum(row); switch( table[c][r]) { case '>': return 3;break; case '<': return 2;break; case '=': return 1;break; default:cout<<endl<<"输入串有误,程序将终止!"<<endl;system("pause");exit(0);break; } } void reduct() { //待定 string token=""; int temp; string str=""; if(!Getnum(stack.gettop())) { token+=stack.gettop(); stack.pop(); } char ch=stack.gettop(); str+=ch; temp=Haven(str); if(temp!=-1) { token+=production[temp][0]; } else { token+=ch; } stack.pop(); bool Nover=true; while(Nover) { if(Getnum(stack.gettop())) { if(compare(stack.gettop(),ch)==2) { Nover=false; } else { ch=stack.gettop(); str=""; str+=ch; temp=Haven(str); if(temp!=-1) { token+=production[temp][0]; } else { token+=ch; } stack.pop(); } } else { token+=stack.gettop(); stack.pop(); } } string token2=""; //cout<<token<<" "; for(int i=token.length()-1;i>=0;i--) { token2+=token[i]; } //cout<<token2<<endl; if(Haven(token2)!= -1) { stack.push(production[Haven(token2)][0][0]); } else { cout<<"输入串有误!分析终止!"<<endl; system("pause"); exit(0); } } int Haven(string temp) { for(int i=0;i<num1;i++) { int j=1; while(production[i][j]!="") { if(temp==production[i][j]) { return i; } j++; } } return -1; } public: ~Functor(void) { } };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值