int i=3; a=2e(i+1); error C2021: expected exponent value, not '(' (编译错误)期待指数值,不能是'(' (exponent n.指数) const int i=3; a=2ei; expected exponent value, not 'i' (编译错误)期待指数值,不能是i 总结:1e10 之类的写法,字母e之前必须要有数字,且e后面的指数必须为整数(在e的前后以及数字之间都不能插入空格)。 error C2064: term does not evaluate to a function 一个没有定义为函数的表达式被当做函数来调用 if(b*b-4*a*c>=0) d=sqrt(b*b-4*a*c); x1=(-b+d)/(2*a); x2=(-b-d)/(2*a); else if后面如果只是只执行一句可以不加括号,然后跟着写else. 但是你后面执行多句话,那么编译器会将你的代码看作为: if(b*b-4*a*c>=0) { d=sqrt(b*b-4*a*c); } x1=(-b+d)/(2*a); x2=(-b-d)/(2*a); else 那么else就没有if与之对应,会显示编译错误。 总结:if-else间执行多条语句时要加大括号。 错误: int a,b=1,a=b; 正确: int a,b=1; a=b; error C2086: 'a' : redefinition 对一个变量a在同一个作用域内进行了两次或两次以上的赋值,编译器无法判断使用哪个。 int a=1,b=2; cout<<a,b; 输出为1(相当于cout<<a;b;) cout<<b,a; 输出为2 cout<<(a,b); 输出为2 cout<<(b,a); 输出为1 cout<<b<<2+3<<1<<a+2; 输出为2513 cout<<a,b<<endl; 相当于cout<<a;b<<endl(错误) 逗号运算符的作用是将若干表达式连接起来,它的优先级别在所有运算符中是最低的,结合方向是"自左至右"的,完毕之后整个表达式的值是最后一个表达式的值。这样(a,b)通过运算,结果就是b。 在C++中,多个表达式可以用逗号分开,其中用逗号分开的表达式的值分别结算,但整个表达式的值是最后一个表达式的值。 假设b=2,c=7,d=5, a1=(++b,c--,d+3) a2=++b,c--,d+3 对于第一行代码,有三个表达式,用逗号分开,所以最终的值应该是最后一个表达式的值,也就是d+3,为8,所以a1=8。 对于第二行代码,那么也是有三个表达式,这时的三个表达式为a2=++b、c--、d+3,(这是因为赋值运算符比逗号运算符优先级高)所以最终表达式的值虽然也为8,但a2=3。 例子: int a[2],x=2,y=5; a[0]=(x+3,y++,x++); 那么最终结果是:a[0]=2 x=3 y=6;(为何a[0]=2:因为(x++)是运算之后再自加) a[1]=(x++,x+3,x+7); 那么最终结果是:a[1]=11,x=4(逗号运算是从左至右,所以先算x++,x从而变成4了(经过第一步x的值已经变成3了),然后a[1]=4+7=11) cout<<(a<<b) 这里要区分两个"<<",第一个是流输出符;第二个是位操作符,左移操作<<. (a<<b)表示将a左移b位。 整个语句的相当于:c = a<<b;cout<<c; 常量:指在程序运行过程中,其值不可改变的量.与变量不同,常量没有名称,由于常量同样要存储,所以其有地址. 程序设计语言中,一般根据数据类型对常量进行分类.在C++中,常量分为如下类型 (1)整型常量(正整数、负整数和0) (2)字符常量(‘a’,‘b’) (3)字符串常量(“a”,“b”) (4)实型常量(1.2,2e3) (5)符号常量(#define a 1;const int a=1) (1)十进制整数(一般表示方法):可以是0~9的一个或多个十进制数位,首位不能为0。例如:100、-200、32767等 (2)八进制整数:必须以0作为起始位,由0~7的一个或多个八进制数位。例如:0100、0123等。 (3)十六进制整数:以0X(或0x)作为起始位,由0~9、a~f(A~F)的一个或多个十六制数。例如0X100、0x123,0xacd等。 int a=1; (a 是整型变量,1是整型常量) char c = 'Y';(c是字符型变量,‘Y’是字符常量) 实型常量又称实数或浮点数。在C语言中可以用两种形式表示一个实型常量。 小数形式是由数字和小数点组成的一种实数表示形式,例如0.123、.123、123.、0.0等都是合法的实型常量。 注意:小数形式表示的实型常量必须要有小数点。 指数形式这种形式类似数学中的指数形式。在数学中,一个可以用幂的形式来表示字母e或E之前必须要有数字,且e或E后面的指数必须为整数。如e3、5e3.6、.e、e等都是非法的指数形式。注意:在字母e或E的前后以及数字之间不得插入空格。 局部变量是指在程序中,只在特定过程或函数中可以访问的变量,是相对与全局变量而言的。 全局变量也称外部变量,是在函数外部定义的,作用域为从变量定义处开始,到本程序文件的末尾。全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序行完毕就释放。 在C++这些面向对象的语言中,一般只使用局部变量。 全局变量的存在主要有以下一些原因: 1,使用全局变量会占用更多的内存(因为其生命期长) 2,使用全局变量程序运行时速度更快一些(因为内存不需要再分配) 3,对于局部变量的名字空间污染,这个在不使用太多变量时是可以避免的。 4,当全局变量与局部变量重名的时候,起作用的是局部变量,全局变量被屏蔽掉。 5,还可以用extern在函数外对全局变量声明,使全局变量的作用域从声明处到文件的结束。 总之,全局变量可以使用,但是全局变量使用时应注意的是尽可能使其名字易于理解,而且不能太短,避免名字空间的污染;避免使用巨大对象的全局变量。 一个由C/C++编译的程序占用的内存分为以下几个部分: 1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。 2、堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。 3、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。(程序结束后由系统释放) 4、文字常量区:常量字符串就是放在这里的。(程序结束后由系统释放) 5、程序代码区:存放函数体的二进制代码。 堆和栈的区别可以用如下的比喻来看出: 使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。 使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。 C/C++程序是如何分配内存的? 方法一: 从静态存储区域分配。 内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。 方法二: 在栈上创建。 在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 方法三: 从堆上分配,亦称动态内存分配。 程序在运行的时候用new申请任意多少的内存,程序员自己负责在何时用delete释放内存。动态内存的生存期由程序员决定,使用非常灵活,但如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏 ,频繁地分配和释放不同大小的堆空间将会产生堆内碎块。 一般来说,编译器将内存分为三部分:静态存储区、栈、堆。静态存储区主要保存静态数据、全局数据和常量,栈存储调用函数相关的变量、地址等,堆存储动态生成的变量,在C++中是指new和delete运算符作用的存储区域。 1、静态存储分配 静态存储分配是指在编译时对数据对象分配固定的存储位置,运行时存储位置始终不变。即一旦存储空间的某个位置分配给了某个数据名,则在目标程序的整个运行过程中,此位置(地址)就属于该数据名。 由静态存储分配产生的数据区称为静态存储区。静态存储分配适用于不允许递归过程或递归调用,不允许可变体积的数据结构的语言。静态存储分配的特点:简单、易于实现。 例:FORTRAN语言,它所有的数据都属于这一类。 2、动态存储分配 动态存储分配是指在运行阶段动态地为源程序中的数据对象分配存储位置。 实行动态存储分配的语言的特点:允许递归过程,允许可变数据结构(可变数组或记录等),允许用户自由申请和释放空间 这种程序在编译时无法确定运行时所需数据空间的大小,需待程序运行时动态确定。 有两种动态存储分配方式:栈式(stack)、堆式(heap)。 3、栈式动态存储分配 在数据空间中开辟一个栈区,每当调用一个过程时,它所需要的数据空间就分配在栈顶,每当过程工作结束时就释放这部分空间。空间的使用符合先进后出的原则。 特点:先进后出,管理简单,空间使用效率高 栈式动态存储分配适合于PASCAL、C等典型过程式语言。 4、堆式动态存储分配 在数据空间中开辟一片连续的存储区(通常叫做堆),每当需要时就从这片空间借用一块,不用时再退还。借用与归还未必服从“先借后还”的原则。 堆式动态存储分配适合于用户可以自由申请和归还数据空间的语言,如C++。 特点:适用范围广,但容易出现碎片。 堆与栈在内存里是怎么分配的? 1、当我们看到一个变量类型是已知的,就分配在栈里面,比如int,double等。其他未知的类型,比如自定义的类型,因为系统不知道需要多大,所以需要程序自己申请,这样就分配在堆里面。 2、简单来说,值类型是分配在栈里面,引用类型分配在堆里面。从内存的分配角度来看,因为值类型已经知道了类型的范围大小,可以进行有效分配,比如int,计算机是知道其范围的,所以直接由系统分配在栈中,无需自己申请;而新的类型,比如自己定义一个类,很明显这个类是不知道大小的,应该有程序自己来申请内存空间,所以由堆来分配!