在学英语时,第一时间学的是字母,其是英语的基础。同样,在C++中,所有的代码都是通过标识符(Identifier)、表达式(Expression)和语句(Statement)及一些必要的符号(如大括号等)组成,在此先说明何谓标识符。
标识符
标识符是一个字母序列,由大小写英文字母、下划线及数字组成,用于标识。标识就是标出并识别,也就是名字。其可以作为后面将提到的变量或者函数或者类等的名字,也就是说用来标识某个特定的变量或者函数或者类等C++中的元素。
比如:abc就是一个合法的标识符,即abc可以作为变量、函数等元素的名字,但并不代表abc就是某个变量或函数的名字,而所谓的合法就是任何一个标识符都必须不能以数字开头,只能包括大小写英文字母、下划线及数字,不能有其它符号,如,!^等,并且不能与C++关键字相同。也就是我们在给一个变量或函数起名字的时候,必须将起的名字看作是一个标识符,并进而必须满足上面提出的要求。如12ab_C就不是一个合法的标识符,因此我们不能给某个变量或函数起12ab_C这样的名字;ab_12C就是合法的标识符,因此可以被用作变量或函数的名字。
前面提到关键字,在后续的语句及一些声明修饰符的介绍中将发现,C++提供了一些特殊的标识符作为语句的名字,用以标识某一特定语句,如if、while等;或者提供一些修饰符用以修饰变量、函数等元素以实现语义或给编译器及连接器提供一些特定信息以进行优化、查错等 *** 作,如extern、static等。因此在命名变量或函数或其他元素时,不能使用if、extern等这种C++关键字作为名字,否则将导致编译器无法确认是一个变量(或函数或其它C++元素)还是一条语句,进而无法编译。
如果要让某个标识符是特定变量或函数或类的名字,就需要使用声明,在后续的文章中再具体说明。
数字
C++作为电脑编程语言,电脑是处理数字的,因此C++中的基础东西就是数字。C++中提供两种数字:整型数和浮点数,也就是整数和小数。但由于电脑实际并不是想象中的数字化的(详情参见《C++从零开始(三)》中的类型一节),所以整型数又分成了有符号和无符号整型数,而浮点数则由精度的区别而分成单精度和双精度浮点数,同样的整型数也根据长度分成长整型和短整型。
要在C++代码中表示一个数字,直接书写数字即可,如:123、3423、-3434等。由于电脑并非以数字为基础而导致了前面数字的分类,为了在代码中表现出来,C++提供了一系列的后缀进行表示,如下:
u或U 表示数字是无符号整型数,如:123u,但并不说明是长整型还是短整型
l或L 表示数字是长整型数,如:123l;而123ul就是无符号长整型数;而344l就是长双精度浮点数,等效于双精度浮点数
i64或I64 表示数字是长长整型数,其是为64位 *** 作系统定义的,长度比长整型数长。如:43i64 f或F 表示数字是单精度浮点数,如:123f e或E 表示数字的次幂,如:344e-2就是0344;02544e3f表示一个单精度浮点数,值为2544
当什么后缀都没写时,则根据有无小数点及位数来决定其具体类型,如:123表示的是有符号整型数,而12341434则是有符号长整型数;而3443表示双精度浮点数。
为什么要搞这么多事出来,还分什么有符号无符号之类的?这全是因为电脑并非基于数字的,而是基于状态的,详情在下篇中将详细说明。
作为科学计算,可能经常会碰到使用非十进制数字,如16进制、8进制等,C++也为此提供了一些前缀以进行支持。
在数字前面加上0x或0X表示这个数字是16进制表示的,如:0xF3Fa、0x11cF。而在前面加一个0则表示这个数字是用8进制表示的,如:0347,变为十进制数就为231。但16进制和8进制都不能用于表示浮点数,只能表示整型数,即0x34343是错误的。
字符串
C++除了提供数字这种最基础的表示方式外,还提供了字符及字符串。这完全只是出于方便编写程序而提供的,C++作为电脑语言,根本没有提供字符串的必要性。不过由于人对电脑的基本要求就是显示结果,而字符和字符串都由于是人易读的符号而被用于显示结果,所以C++专门提供了对字符串的支持。
前面说过,电脑只认识数字,而字符就是文字符号,是一种图形符号。为了使电脑能够处理符号,必须通过某种方式将符号变成数字,在电脑中这通过在符号和数字之间建立一个映射来实现,也就是一个表格。表格有两列,一列就是我们欲显示的图形符号,而另一列就是一个数字,通过这么一张表就可以在图形符号和数字之间建立映射。现在已经定义出一标准表,称为ASCII码表,几乎所有的电脑硬件都支持这个转换表以将数字变成符号进而显示计算结果。
有了上面的表,当想说明结果为“A”时,就查ASCII码表,得到“A”这个图形符号对应的数字是65,然后就告诉电脑输出序号为65的字符,最后屏幕上显示“A”。
这明显地繁杂得异常,为此C++就提供了字符和字符串。当我们想得到某一个图形符号的ASCII码表的序号时,只需通过单引号将那个字符括起来即可,如:’A’,其效果和65是一样的。当要使用不止一个字符时,则用双引号将多个字符括起来,也就是所谓的字符串了,如:"ABC"。因此字符串就是多个字符连起来而已。但根据前面的说明易发现,字符串也需要映射成数字,但它的映射就不像字符那么简单可以通过查表就搞定的,对于此,将在后续文章中对数组作过介绍后再说明。
*** 作符
电脑的基本是数字,那么电脑的所有 *** 作都是改变数字,因此很正常地C++提供了 *** 作数字的一些基本 *** 作,称作 *** 作符(Operator),如:+ - / 等。任何 *** 作符都要返回一个数字,称为 *** 作符的返回值,因此 *** 作符就是 *** 作数字并返回数字的符号。作为一般性地分类,按 *** 作符同时作用的数字个数分为一元、二元和三元 *** 作符。
一元 *** 作符有: + 其后接数字,原封不动地返回后接的数字。如: +44f的返回值是44;+-93f的返回值是-93。完全是出于语义的需要,如表示此数为正数。 - 其后接数字,将后接的数字的符号取反。如: -344f的返回值是-344;-(-54)的返回值是54。用于表示负数。 ! 其后接数字,逻辑取反后接的数字。逻辑值就是“真”或“假”,为了用数字表示逻辑值,在 C++中规定,非零值即为逻辑真,而零则为逻辑假。因此3、434、’A’都表示逻辑真,而0则表示逻辑假。逻辑值被应用于后续的判断及循环语句中。而逻辑取反就是先判断“!”后面接的数字是逻辑真还是逻辑假,然后再将相应值取反。如:
!5的返回值是0,因为先由5非零而知是逻辑真,然后取反得逻辑假,故最后返回0。
!!3454的返回值是1,先因3454非零得逻辑真,取反后得逻辑假,再取反得逻辑真。虽然只要非零就是逻辑真,但作为编译器返回的逻辑真,其一律使用1来代表逻辑真。 ~
其后接数字,取反后接的数字。取反是逻辑中定义的 *** 作,不能应用于数字。为了对数字应用取反 *** 作,电脑中将数字用二进制表示,然后对数字的每一位进行取反 *** 作(因为二进制数的每一位都只能为1或0,正好符合逻辑的真和假)。如~123的返回值就为-124。先将123转成二进制数01111011,然后各位取反得10000100,最后得-124。
这里的问题就是为什么是8位而不是16位二进制数。因为123小于128,被定位为char类型,故为8位(关于char是什么将下篇介绍)。如果是~123ul,则返回值为4294967172。
为什么要有数字取反这个 *** 作?因为CPU提供了这样的指令。并且其还有着很不错且很重要的应用,后面将介绍。 关于其他的一元 *** 作符将在后续文章中陆续提到(但不一定全部提到)。
#include<stdioh>
#include<stdlibh>
#include<stringh>
double f(double a[100],char b[100],int la,int lb)
{
int i,j,k;
for(i=0;i<lb;i++)
{
if(b[i]==’’)
{
a[i]=a[i]a[i+1];
for(j=i;j<lb-1;j++)
b[j]=b[j+1];
for(j=i+1;j<la-1;j++)
a[j]=a[j+1];
la--;
lb--;
i--;
}
else if(b[i]==’/’)
{
a[i]=a[i]/a[i+1];
for(j=i;j<lb-1;j++)
b[j]=b[j+1];
for(j=i+1;j<la-1;j++)
a[j]=a[j+1];
la--;
lb--;
i--;
}
}
for(i=0;i<lb;i++)
{
if(b[i]==’+’)
{
a[i]=a[i]+a[i+1];
for(j=i;j<lb-1;j++)
b[j]=b[j+1];
for(j=i+1;j<la-1;j++)
a[j]=a[j+1];
la--;
lb--;
i--;
}
else if(b[i]==’-’)
{
a[i]=a[i]-a[i+1];
for(j=i;j<lb-1;j++)
b[j]=b[j+1];
for(j=i+1;j<la-1;j++)
a[j]=a[j+1];
la--;
lb--;
i--;
}
}
return a[0];
}
main()
{
char b[100],c[100],y[100];
double a[100],s,t,x[100];
int i,j,k,la,lb,l,ld,le,d[100],e[100],g[100],lx,ly;
while(gets(c))
{
i=0;j=0;t=1;l=0;
for(k=0;k<100;k++)
a[k]=0;
s=0;
for(k=0;c[k];k++)
{
if(c[k]>=’0’&&c[k]<=’9’)
if(t==1)
{
s=s10+c[k]-’0’;
}
else
{
s=s+(c[k]-’0’)t;
t=t/10;
}
else if(c[k]==’’)
t=01;
else if(c[k]==’+’||c[k]==’-’||c[k]==’’||c[k]==’/’)
{
b[i]=c[k];
a[i++]=s;
s=0;
t=1;
}
else if(c[k]==’(’)
{
g[j++]=i;
}
else if(c[k]==’)’)
{
e[l++]=i;
}
}
a[i++]=s;
ld=j;
le=l;
la=i;
lb=la-1;
for(i=0;i<ld;i++)
d[i]=g[ld-i-1];
for(i=0;i<ld;i++)
{
for(j=0,k=d[i];k<e[i];k++,j++)
{
x[j]=a[k];
y[j]=b[k];
}
x[j++]=a[k];
lx=j;
ly=j-1;
a[(d[i])]=f(x,y,lx,ly);
k=e[i]-d[i];
for(j=d[i]+1;j<la-1;j++)
{
a[j]=a[j+k];
b[j]=b[j+k];
}
a[j]=a[j+k];
la=la-k;
lb=lb-k;
for(j=i+1;j<ld;j++)
e[j]=e[j]-k;
}
s=f(a,b,la,lb);
printf("s=%lf\n",s);
}
}
#include <stdioh>
int main()
{
printf("5>3&&2||8<4运算结果为:%d",5>3&&2||8<4);
return 0;
}
大于小于的优先级>与&&>或||,因此先计算5>3为真,结果为1;再计算1&&2,结果为真,再计算1||8<4,结果为1。
扩展资料:
1、优先级与求值顺序无关。如a+b && bc,虽然优先级最高,但这个表达式求值顺序是从左到右。
2、优先级从上到下依次递减,最上面具有最高的优先级,逗号 *** 作符具有最低的优先级。
3、相同优先级中,按结合性进行结合。大多数运算符结合性是从左到右,只有三个优先级是从右至左结合的,它们是单目运算符、条件运算符、赋值运算符。
4、基本的优先级需要记住:
指针最优,单目运算优于双目运算。如正负号。先算术运算,后移位运算,最后位运算。请特别注意:1 << 3 + 2 & 7等价于 (1 << (3 + 2))&7。逻辑运算最后结合。
参考资料:
百度百科-运算符优先级
问题一:
表达式a+=a-=aa 从右向左计算。
1 先计算a = a - aa,此时右边的a=3,故而最后a变为3-33=-6
2 再计算a = a + a,此时右边的a=-6, 故而最后a变为-6 + -6 = -12
问题二:
'a'<=c<='z' 不是有效的表达式,格式应该为'a'<=c && c<='z'
在执行布尔运算的情况下,或是当表达式被用于流程控制语句时,以下值会被解析为假值: False, None, 所有类型的数字零,以及空字符串和空容器(包括字符串、元组、列表、字典、集合与冻结集合)。 所有其他值都会被解析为真值。 用户自定义对象可通过提供 __bool__() 方法来定制其逻辑值。
运算符 not 将在其参数为假值时产生 True,否则产生 False。
表达式 x and y 首先对 x 求值;如果 x 为假则返回该值;否则对 y 求值并返回其结果值。
表达式 x or y 首先对 x 求值;如果 x 为真则返回该值;否则对 y 求值并返回其结果值。
请注意 and 和 or 都不限制其返回的值和类型必须为 False 和 True,而是返回最终求值的参数。 此行为是有必要的,例如假设 s 为一个当其为空时应被替换为某个默认值的字符串,表达式 s or 'foo' 将产生希望的值。 由于 not 必须创建一个新值,不论其参数为何种类型它都会返回一个布尔值(例如,not 'foo' 结果为 False 而非 ''。)
条件表达式(有时称为“三元运算符”)在所有 Python 运算中具有最低的优先级。
表达式 x if C else y 首先是对条件 C 而非 x 求值。 如果 C 为真,x 将被求值并返回其值;否则将对 y 求值并返回其值。
计算表达式:f=a(b+c)/(d-e)
假设a,b,c,d,e,f都是定义好的标号,并且大小都是word,那么实现指令如下
mov ax,c ;计算(b+c)
add ax,b
mov cx,d ;计算(d-e)
sub cx,e
mul a ;计算a(b+c),执行下面一条指令后积在DX:AX
div cx ;计算整式
;此时AX是商,DX是余数,返回到f
mov f,ax
以上就是关于C++程序设计从零开始之表达式全部的内容,包括:C++程序设计从零开始之表达式、求c语言求表达式程序、编一个程序计算表达式5>3&&2||8<4的值,并用输出语句把值输出等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)