大一上第一学期期中复习知识点梳理 之 c++基础知识

一、进制

1)进制介绍

16进制:最多两位,最大为7F;

8进制表的ascii最高为127.

 2)进制转换

PS/颠倒输出某整数的16进制形式:

int a16[32];int sum=0;
    while(a)
    {
        a16[++sum]=a%16;
        if(a16[sum]<10) {a16[sum]=49+a16[sum]-1;}
        else if(a16[sum]>=10){a16[sum]=65+a16[sum]-10; }
        a/=16;
    }
    cout<<"0x";
    for(int i=1;i<=sum;i++)
    {
        char t=a16[i];
        cout<<t;
    }

 

int n;
    m=a;
    while(m>0)
    {
        n=m&15;
    if(n<10)
            cout<<n;
        else
            cout<<char(87+n);
    m=m>>4;
    }

 

3)进制前缀(整型常量int类型)

 4)进制转义序列字符及含义(char类型)

'\nnn' 八进制表示 用八进制ASCII码表示字符

'\xnn' 十六进制表示 用十六进制ASCII码表示字符

5)输入输出进制控制

进制前缀showbase:输出时不加则默认不显示前缀,加上才显示前缀(例如0x)。

输出格式1:cout(<<showbase)<<hex<<a<<endl;

输出格式2:cout(<<showbase)<<setbase(16)<<a<<endl;

                   使用setbase函数输出8,10,16进制,头文件iomanip

二、浮点型

1)科学计数法表示(指数形式)

尾数+E或e+阶数 

例:-0.34e-2; 1e3.

要求:尾数部分必须有数字,指数(阶数)部分必须为整数 。

2)精度后缀:F或f结尾

注意:小数实数常量默认按double存储(float存精度小丢失);

          例:float f=-3.14F(强制按单精度存储) ; double f=-3.14 .

3)浮点数格式控制

注意:一旦使用之后都是对当前整个程序有效,之后如果不想要此格式需改!!!

 

例子:输出5位小数: cout<<fixed<<setprecision(5)<<a;(一定记得fixed加在前面)

          输出科学计数法表示的5位小数: cout<<scientific<<setprecision(5)<<a;(此不需要加fixed啦)

三、字符和字符串

1、字符

1)字符型常量

用''(单引号)引起的单个字符,char类型.

 特殊字符:'\n'换行符(回新行); '\r'回车符(回开头); '\t' 制表符  ; '\0' 字符串结束符(可不写系统自带)

2)字符的输入输出

I)cin输入数据

cin>>a1>>a2>>a3;

II)cin.get()函数输入数据:将输入的所有字符(包括间隔符)都作为输入字符赋给字符变量,一次只能提取一个字符的值。

例如:cin.get(a1); cin.get(a2); cin.get(a3);

III)输出数据间+间隔:“ ”或’ ‘或’\t‘或’\n‘或endl;

3)字符数组

数组中元素为字符。初始化:char name[]={'N','a','n','j','i','n','g'};

也可以用字符串常量初始化:char name[]="Nanjing";(注意:最后会多出一个字符’\0’,故字符数组大小定义应注意多出结束符的空间)。

2、字符串

1)字符串常量

用“”(双引号)引起的若干个字符,char a[] /string类型.

 注意:'\0'(ASCII码值为0)为自带,例如,在sizeof("1234")=5,字符串实际为“1234\0”.

注:若只有结束字符则为空字符

注意:例如,“\1234\n”显示的结果为 S4(回车),原因为8进制表示的ASCII码最多为127(2^7-1),16进制表示的ASCII码最多为7F(最多两位)(2^7-1)。

2)字符串的输入输出

cin.getline(s,n);      s:字符数组名称;n:读入字符的最多个数(包含'\0')。

getline()以回车作为结束,在此之前输入的所有字符都会放入字符数组。

例:char city[11]; cin.getline(city,10); cout<<city<<endl;

3)字符数组与字符串处理

头文件<cstring>

strlen(s):字符串s的实际长度(不包括‘\0’)

strcpy(s1,s2):字符串s2中‘\0’之前的所有字符依次赋值到s1中,最后再加上一个'\0'。

(注意:由于不能直接给字符数组名赋值,因此将一个字符串的值赋给另一个字符串时必须用字符串赋值函数完成)

例如:char string2[20]; strcpy(string2,"VC++");  而不是string2="VC++";

注意:sizeof():计算字符串长度包含结束符;strlen():计算字符串长度为结束符前长度,不包含结束符。即strlen()+1==sizeof()。

四、变量和常量

1、变量

1)变量定义(说明):

英文字母、数字、下划线组成;

至少含一个英文字母;

首字母必须为英文字母或下划线;

英文字母区分大小写;

唯一性。

2)常变量: 说明符const修饰。

3)变量初始化:

int x=5; 或 int x(5);

=是初始化符号; ()也是初始化符号(仅c++中)

=用处:

int x=5; =为初始化符号;

x=7; =为赋值运算符。

2、文字常量的范围、精度后缀:

长整型常数:L或l结尾

无符号常整数:U或u结尾

无符号长整型常数:UL或LU(大小写均可)结尾

浮点型常熟:F或f结尾

五、运算符

1、类别

1)算术运算符:+、-、 * 、/、%
       /:当两个操作数均为整数,所执行的运算为整除,结果为整数,整出运算结果舍去小数取整;只要有一个操作数是实数,则两个操作数均转换为double型,结果是实数。
      %:要求两个操作数均为整数。如果两个整数中有负数,则结果的符号与被除数相同。
      运算优先级:括号中运算具有最高优先级;先乘除,后加减。
      注意:数据溢出问题。只会对除法运算中除数为0的情况提示出错;而溢出不作为错误处理,程序将继续执行并产生错误的计算结果,需程序设计者解决问题。
2)关系运算符:>、<、==、!=、<=、>=
      运算优先级:>、<、>=、<=优先于==、!=。
3)位运算符: ~ 、&、|、 ^ 、<<、>> (二进制补码运算)
       i) ~按位取反:每个二级制位取反,1变0、0变1;
       ii) <<左移运算符:将a的二进制数依次向左移动n个二进制位,并在低位补0。(即*(2^n),乘法)
       iii) >>右移运算符:将左操作数向右移动右操作数指定的二进制位数,忽略移位后的小数部分并在高位补0。(即/(2^n)后取整,除法)
       iv) &按位与:对应位均为1时,位运算结果为1;否则为0。(类似位乘
       v) |按位或:只要有一个数的对应位是1,则该位运算结果为1;若两个数对应位均为0,则该位结果位0。
       vi) ^按位异或:当对应位值不同,该位运算结果为1,否则为0。(类似位加
       运算优先级:~ 优先于 << 优先于 >> 优先于 & 优先于 ^ 优先于 | 
4)逻辑运算符:&&、||、!(bool型)
       i) !:逻辑非:操作数值为真时,结果为假;反之结果为真。
       ii) && :逻辑与:当两个操作数全为真时,结果为真;否则为假。
                  (注:a&&b :若a false 则 b 不执行)
       iii) || :逻辑或:两个操作数中只要有一个为真,则结果为真;否则为假。
                   (注: a||b :若a true 则 b 不执行)
        运算优先级:逻辑非>关系运算符>逻辑与、逻辑或;逻辑与和逻辑或同级运算,两者同时出现时从左到右进行运算。
5)赋值运算符:=、+=、-=、 *=、/=、%=、>>=、<<=
     左值:左操作数,必须放在内存中可以访问且可以合法修改值的存储单元中,通常只能是变量名(不能是常数、表达式)。
     右值:右操作数,为常量or变量or表达式,但一定能取得确定的值。
     赋值表达式(例如a=1)本身有值,其左值就是赋值表达式的值。
6)其他
    顺序运算符(,) 、括号运算符()、自增/自减运算符(++、--)
    i),顺序运算符:从左到右依次求出各表达式的值,并将最后一个表达式的值当作整个逗号表达式的值。
    ii)++/--自增/自减运算符前置:变量值先增减后引用;后置:变量值先引用后增减。
    下标运算符[ ]、地址运算符(* 、&)、成员运算符(.、->)、域运算符(::)、动态变量运算符(new、delete)
    类型运算符(sizeof、typeid)
    iii)逗号运算符:从左到右依次求出各表达式的值,并将最后一个表达式的值当做整个表达式的值。
    iv)sizeof()计算一个操作数类型或者一个变量的字节。 sizeof(变量名) 或 sizeof(数据类型)。例如:sizeof(int)==4;sizeof float ==4;

 条件运算符:表达式a?表达式b:表达式c; 即表达式a若成立,执行表达式b,否则执行表达式c。

2、操作数要求与影响

1)要求

 void类型操作数不能进行求值运算(编译错误),可以参与类型运算
//=%%=右操作数不能是0 (3级编译警告和运行时错误)
%%=位运算操作数不能是浮点型(编译错误)
 <<、>>、<<=、>>=的右操作数≥ 0且<32(1级编译警告,计算结果未定义)
 ++ 、-- 、=和复合赋值运算的左操作数必须是左值(编译错误)
 逻辑运算的操作数要求是bool型(无警告和错误,自动转换)
2)影响
 /:整型(整除)和浮点型(小数除法)
注意:若商值为小数,表达式应是 例如:b=(2.0*a)/(3.0*a+1.0);且a、b为float或double型。
 %:余数正负符号与被除数一致
 >>:有符号整数带符号右移,无符号整数高位补0

 3、类型不匹配时数据类型提升

1)强制类型转换

(type)表达式  或  type(表达式)。

强制类型转换不改变本身的值。

2)字符数据赋值给整型数据

对于无符号字符数据,低位字节不变,高位字节补0;对于有符号字符数据,若符号位为0,则与无符号字符数据转换规则相同,若符号位为1,则低位字节不变,高位字节全部置3)一般的提升规则

1)向大的类型靠:

char + int = int  ;  int + long long = long long  ;  int + float = float  ;  int + double = double .

2)至少是int:

short + short = int  ;  short + char = int  ;  char + char = int .

 4、优先级与结合性

 关系运算符 >、<、>=、<= 优先于 ==、!=。

位运算符 ~ 优先于 << 优先于 >> 优先于 & 优先于 ^ 优先于 | 。

整体优先关系:算术 > 比较 > 逻辑 > 自增减 > 赋值 > 位运算 > 移位 > 条件 > 逗号 > 内存操作 > 指针 > 成员与限定。

优先关系:: (域运算)【→】  优先于 成员运算【→】、()(括号、函数调用、类型构造)【→】[ ](数组下标)【→】++\--(后置递增\减)【→】、类型转换运算【→】 优先于 sizeof(对象\类型大小)【←】++\--(前置递增\减)【←】~(按位取反)【←】!(逻辑非)【←】+\-(单目正\负)【←】*(间接引用)【←】&(取地址)【←】、new(分配对象\分配并初始化对象\分配数组)【←】、delete(释放对象\释放数组)【←】、(type)或type()(强制类型转换)【←】 优先于 ->*(间接访问指针指向的类成员)【→】、.*(直接访问指针指向的类成员)【→】 优先于 *(乘)【→】/(除)【→】%(求余)【→】 优先于 +(加)【→】-(减)【→】 优先于 <<\>>(按位左\右移)【→】优先于<\<=\>\>=(比较大小)【→】优先于 ==\!=(比较是否相等)【→】 优先于 &(按位与)【→】 优先于 ^(按位异或)【→】 优先于 |(按位或)【→】 优先于 &&(逻辑与)【→】 优先于 ||(逻辑或)【→】 优先于 ?:(条件运算)【←】 优先于 =(赋值)【←】+=\-=\*=\/=\%=\<<=\>>=/&=\|=\^=(复合赋值)【←】 优先于 throw(抛出异常)【←】 优先于 ,(逗号)【→】

注意:有无符号数影响可能产生完全相反结果。

PS/连续比较问题:

1)语法上正确。

2)语义上不一定是所想要的。 例如: 0<x<5 等价于 (0<x)<5 等价于(0或1)<5 一定成立 结果一定为1。 若想表示x是否在0和5之间:正确写法为 0<x&&x<5.

                                                          x==y==0 等价于 (x==y)==0 ,如果x与y相等,1==0,结果为0;如果不等,0==0,结果为1; 正确写法:x==0&&y==0.

PS/"=="错写成"=":

if(x=0) 语法正确,语义错误:0赋值给x,返回0,if永远不成立。

if(x=1) 语法正确,语义错误:1赋值给x,返回1,if永远成立。

while(x=1) 导致死循环

while(x=0) 导致不进入循环

PS/短路运算:

&&、|| 只要左边决定了运算,结果右边不计算。

a||b:若a为true,b不计算 ;a&&b:若a为false,b不计算。

利用:if(count>0&&sum/count>5) 避免了除0的情况

前自增自减:先加减后返回;后自增自减:先返回后加减,等所有执行完语句再加减。

PS/连续简单赋值:

逆向结合性+返回值是赋值后的结果。 

x=y=z=0; 等价于 x=(y=(z=0)); 

六、基本数据类型

1、关键字

具有特定含义的全由小写字母组成的英文单词。

and "&&"         and_eq "&="        bitand  "&"          bitor   "|"           compl   "~"         not  "!"          or  "||"         or_eq  "|="       xor "^"      xor_eq  "^="       not_eq  "!="

2、标识符

由字母和下划线开始;

由字母、数字或下划线组成;

用户自定义标识符时不能使用关键字,也不能与库函数名、类名、对象名等同名。

3、标点符号

分隔符作用的符号:标点符号、运算符、空格符、制表符、回车符等。

2、基本数据类型

整型:处理整数。整数(不加说明时指有符号整数)在内存中存放的是它的补码;无符号整数没有符号位,存放的就是原码。

(单)字符型:处理字符,存储的是该字符的ASCII码,占用一个字节。数据本质上也是整数,可以是任何一个8位二进制整数。

汉语系字符:双字节字符集,每个字符用2个字符编码。

单精度型、双精度型:都用来处理实数,两者表示的实数精度不同。实数在内存中以规范化的浮点数形式存储,包括尾数+数符+阶码数的精度取决于尾数的位数。32位机上单精度型为23位(实际24位),双精度型为52位(实际53位)。

布尔型(逻辑型):处理逻辑值,其取值只有true和false。可以和整型相互转换,false对应0,true对应1或非0。

可以加上修饰词:signed、unsigned、long、short。

int和char默认有符号。

 

 2、数据类型定义别名

类型别名(typedef)

例:typedef unsigned char BYTE;

则unsigned char a; 等价于 typedef a;

七、数据输出间隔处理

1、空格:' ' or " " or  '\t' .

2、回车换行:'\n' or endl.

3、setw()指定输出数据项的宽度

头文件:#include<iomanip>

注意:仅对后一个数有效!

例:int i=2,j=3;cout<<setw(6)<<i<<setw(10)<<j<<endl;

()中为一个正整数值,限定了紧跟其后的一个数据项的输出宽度。若数据实际宽度小于指定宽度,则按右对齐在左边留空;若数据实际宽度大于指定宽度,则按实际宽度输出,即指定宽度失效。

 八、原码、反码、补码、移码

1、原码:有符号

最高位表示正负,0正1负;其余位绝对值。

正数不变,负数表2^(n-1)+|x|(-2^n-1<x<0)。

0表示不唯一;加减不便需转换。0分正负不唯一: [+0]原=(00000000)2=0;[-0]原=(10000000)2。

2、反码:有符号

最高位表正负,0正1负;其余位正取原值,负对|x|各位取反。

负表示2^(n-1)+x(-2^(n-1)<x<0)。

0表示不唯一;加减简单。

3、补码:有符号(n=8)

最高位正负,0正1负;其余位,正取原值,负取补2^n-1-|x|。

负数表示2^n+x(-2^(n-1)<=x<0)。

0表示唯一;加减简单。

trick:反码+1=补码(二进制)

4、移码:有符号(偏移2^7=128)

无符号位,真值加上固定偏移(例如:加2^(n-1)+x)

0表示唯一,但不是全0。

比较运算简单,加减稍繁。

trick:移码=补码符号位取反。

PS/原、反、补码中正数都不变;仅补码、移码中0表示唯一。

posted @ 2022-10-24 20:36  Au0702  阅读(540)  评论(0)    收藏  举报