编译技术算符优先分析课设c++_自学C++基础教程(运算符优先级)

f592aea43a8c6968bacdcaae544fbea3.png

最近工作忙,大半个月没有更新了,现在抽出空,整理下资料,让大家久等了~~

C++语言中,运算符的运算优先级共分为16级。1级最高,16级最低

4ba5f170b3bb532755e4a3638b130bae.png

在表达式中,各操作数参与运算的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的制约,以便确定是自左向右进行运算,还是自右向左进行运算。

算术运算符的结合性是自左至右,先左后右。

例:x-y+z ——> (x-y)+z

赋值运算符是右结合性运算符,先右后左。

x=y=z ——>y=z;x=y;

数据是程序处理的对象,它被区分为不同的类型,称为数据类型。

布尔型(bool):

布尔型(bool),只能取值true或false,用一个字节存储。

字符型(char):

字符型(char)用一个字节表示,常用于表示字符或小整数。

在代码编辑区键入如下代码并编译、运行、观察效果:

#include <iostream>

using namespace std;

void main()

{

cout<<"bool型所占用的字节数为:"<<sizeof(bool)<<endl;

cout<<"char型所占用的字节数为:"<<sizeof(char)<<endl;

system("pause");

}

整型:

short 、 int、long,可以用来表示不同范围的整数值,它们占用的存储空间也是不同的。

短整型类型说明符为short :它在内存中占2个字节。

普通整数类型说明符为int:它在内存中占4个字节。

长整型类型说明符为long :

在32位操作系统,32位编程环境下在内存中占4个字节。

在64位操作系统,64位编程环境下在内存中占8个字节。

在代码编辑区键入如下代码并编译、运行、观察效果:

#include <iostream>

using namespace std;

void main()

{

cout<<"short型所占用的字节数为:"<<sizeof(short)<<endl;

cout<<"int型所占用的字节数为:"<<sizeof(int)<<endl;

cout<<"long型所占用的字节数为:"<<sizeof(long)<<endl;

system("pause");

}

无符号类型说明符:unsigned

对于字符型数据类型char,整型数据类型short、int、long,C++语言提供了另一个说明符:“unsigned”用来约束整型的取值范围。被修饰为unsigned的变量当赋值为负数时,数据结果是错误的。(特别注意:VS2005 IDE 不会提示错误,但输出结果不正确)

在代码编辑区键入如下代码并编译、运行、观察效果:

#include <iostream>

using namespace std;

void main()

{

unsigned int uiValue = 10; //正确

unsigned short usValue = -10; //错误,但编译不会提示错误

cout<<“uiValue = ”<<uiValue<<endl; //正确输出

cout<<“usValue = ”<<usValue<<endl; //错误输出

system("pause");

}

浮点型:

C ++语言提供了3个表示实数的类型:

单精度浮点数类型,简称单精度类型,类型名为float;

双精度浮点数类型,简称双精度类型,类型名为double;

长双精度浮点数类型,类型名为long double,简称长双精度类型。

在代码编译栏中输入以下代码进行编译,查看结果。

#include <iostream>

using namespace std;

void main()

{

cout<<"float类型占用字节数为:"<<sizeof(float)<<endl;

cout<<"double类型占用字节数为:"<<sizeof(double)<<endl;

cout<<"long double类型占用字节数为:"<<sizeof(long double)<<endl;

system("pause");

}

类型修饰符

布尔型是不能被修饰的。short只能修饰int型,long可以修饰int型和double型。unsigned和singned都可以修饰char、int,默认的char和int是signed 类型。

23b9ebbf7c6ea3bd65c890faea2d3e22.png

好了,这次就到这里啦。还是和往期一样,学习资料链接拿走:

链接:https://pan.baidu.com/s/1N4vZYeRPA4y2P42rP_t_JQ

提取码:ktb7

学习从来都不是一个人的事,如果你感觉小编的这篇文章对你有帮助的话,可以关注小编首页和小编来一起学习C/C++语言,小编会持续更新后续的内容哦!!

算符优先分析文法是一种工具,在编译的过程中,隶属于语法分析环节,却又与中间代码的生成息息相关,编译可以分为五个阶段:词法分析、语法分析、语义分析(中间代码的生成)、代码优化、目标代码生成。语法分析是指:在词法分析基础上,将单词符号串转化为语法单位(语法范畴)(短语、子句、句子、程序段、程序),并确定整个输入串是否构成语法上正确的程序。也就是说语法分析是检验输入串的语法是否正确,注意这里的语法正确,只是简单地符合自己定义的规范,而不能检测出运行时错误,比如"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、付费专栏及课程。

余额充值