第二章
数据类型、运算符与表达式
1.一个有符号char型的数据的范围为-128~+127,占用1个字节(8位),无符号的char型数据范围为0~255.
)‘/87’(改为‘/x87’后输出?因为‘/x87’代表是一个字符,即应该输出135表示的字符,系统找不到这个字符,故输出?)。
int型(一般实际中用的多为4字节),无符号范围为:-2147483648~2147483647(35u表示35)。有符号范围为:无符号范围为:0~4294967295(10位数)Short
int型(2字节)无符号范围为:-32768~+32767,有符号范围为0~65535.long
int也占用4字节(如34L、34l)。Short
int在内存中占2个字节。
float占用4字节,double占用8字节。Float表示数字可以有如下代表方式:.5(0.5)
-.567(-0.567)
0.0086e-32(输出结果8.6e-035)。
求有符号数时,最高位1表示为负数,除了最高位,其余位取补码再加1,就是它的值,如int(内存中表示)(1111
1111 1111 1111 1111 1111 1111 1111)为-1.
2.C++语言是一种强类型的语言,即区别大小写。因此INT、FLOAT也可以用来做变量名。
3.不同类型的整型数据传递规律只有一条,按内存中存储格式直接传送。
4.小数指数方式有如1234e+4、0.005e-3、e后面要是整数。float:提供7~8位有效数字,小数点后6~7个数。double:
占八个字节,提供15~16位有效数字。在输出的时候,1234e+4会变成1234e+004,即e后面是三位数。
5.特殊字符:/a响铃,/n换行,/t制表位,/b退格,/r回车13,/f换页,/v竖向跳格,//反杠,/’,/”,/0,/ddd,/xhh。
这些转义字符只包含一个字符,编译系统在见到字符“/”时,会接着找它后面的字符,把它处理成一个字符,在内存中只占一个字节,
/不占用内存空间。输出 c:/tc/tc
表示为cout<<“c://tc//tc”(分解为c : // t c // t c);占9个字节(包括最后的空字节),strlen为
8. cout<<“c:/t/tc//tc”(
c : /t /t c // t c)<<endl;输出c:
c/tc,也占用9个字节,strlen为
8. cout<<“c:/t/t/tc//tc<<endl;10字节 strlen为
9. cout<<”c://t//t/tc//tc(c : // t // t /t c // t c)12字节strlen为
11 (/后面的字符如果不能为转义字符,原样输出,转义字节也占用1个内存空间)。
可以用转义字符表示任一一个ASCII字符
‘/ddd’ (八进制)‘/xhh‘
(十六进制)'/101' '/x41'
'/x61'
'/141‘ "c:/n///n/tc//tc“(c : /n // /n /t c // t c)
sizeof:11,strlen:10. "c:/n///n/tc//tc/n" sizeof:12,strlen:11. 总共,转义字符是占用内存单元的。即/t、/n等都占用一个内存单元。Sizeof是指字符串占用的内存单元(包括结尾的/0),strlen指字符串的长度,
(不包括结尾的/0),所以上面看到的strlen总比sizeof要少一个1(因为是字符).
int a=44,a的sizeof:4,无strlen项(此项只能在字符串中拥有)。
6.标识符常量:#define和const两种。例:#define
PRICE 30。#undef PRICE
对其进行作用域终结。然后就可以重新定义。#define不占用内存空间,只是简单的替换。const
float pi=3.1415926; //将变量pi定义为常量(占用内存,不能改变其值,只能用指针强改其值)
。前者可以随时使用#define来改变值,后者要改变:改变const值步骤:1.int
b=1;const int a=b;必须要这样写,如果写成const int a=1;结果出不来(即要通过一个中间值来替换,而不能直接给变量赋值)。cout<<a<<endl;//a=1;
2.const int *p=&a;*(int*)p=2;//必须要有(int*)。cout<<a<<endl;//a=2;(通过指针强制类型转换)。后者不能随便改变其值。对类型为float的变量改变值时,只需要第2步就可以了,不需要第一步。注:用强制类型转换可以打破const限制,不管是指针常量还是指向常量的指针。
参考http://zhidao.baidu.com/question/120216130.html
7.算术运算符和算术表达式:+
- * / %.优先级是() * / % + -. %(整数才可求余,余数的符号与左边数的符号相同,先用正数求余,再加符号)。
8.自增自减运算:只能用于变量,不能用于表达式和常量。(因为表达式在内存内没有具体空间,常量所占的空间不能重新赋值3++、(x+y)++、(-i)++(这三种都是错误的))。
int i=4;int j=5; cout<<i<<‘/t’<<j<<‘/t’<<i+++j<<‘/t’<<i<<‘/t’<<j<<endl;//5
5 9 4 5
i+++j
(=(i++)+j)cout时从最后面的语句开始。
9.下面是变量赋值问题。少字节变多字节:少变多时,用符号位补齐符号位(若两个数符号相同,则相同,若符号不同,用符号位补齐)。多字节变少字节时,低位照搬(会发生截断),
10.复合赋值运算结合性为自右向左。优先级:!
&& | |。运算优先级为!
算术
关系
逻辑
赋值
逗号。<
> <=
>= 的优先级大于= =
!=。当前面的表达式可以得到整个表达式结果时,不必再求后面的表达式。判断闰年条件:(year%400= =0) || (year%4= =0&&year%100!=0)。逗号表达式结果是最后一个表达式值。!x&&x+y&&++y:(!x)&&(x+y)&&(++y)。
11.各种数据类型间混合运算:不同类型数据要转换成相同类型数据进行运算。转换规则:char---int---unsigned---long—double
float—double。
第三章
简单的输入输出
1.用cin输入时,输入语句自动过滤空白字符。要按预期格式输入字符,否则会导致不可预测结果,影响程序正常运行。若要把键盘上输入的每一个字符,包括回车和空格都做为输入字符,要用cin.get(),此语句一次只能提取一个字符,并将它赋给字符型变量,如:char
c1,cin.get(c1)。
2.当输入数据为8进制或者16进制或者10进制时,如下所示:cin>>hex>>i、cin>>oct>>i、cin>>dec>>i。8进制和16进制只能用于整数。一旦指定了输入格式,除非下次指明用哪种格式输入,否则仍用上次指定的格式输入。指定输出项宽度:cout<<setw(6)<<i<<endl;向右对齐,setw=set
width,要在头文件包含#include <iomanip.h>,setw中要是一个整数,它只对后面一个数有效。
2.浮点型数据用科学记数法输出:cout.setf(ios::scientific,ios::floatfield),表示用浮点数用科学表示法输出(形式如3.140000e+000
)。其设置和整数设置一样,对后面的所有输出都有效,如果不想用科学记数法输出小数,改用定点数格式输出(缺省的输出方式):cout.setf(ios::fixed,ios::floatfield)。
第四章
C++的流程控制语句
1.条件运算符:三目运算符,结合方向自左向右,三个表达式的类型可不同。
2.switch语句:default后若没有break,和case后没break效果一样,在程序中,default语句一般都在最后面,所以即使它后面没有break,程序也要结束。不过最好在default后加上break。Default语句也可以省略,这时若不满足条件什么也不执行。Case后为常量,为整型和字符型都可以。
3.do-while
语句和 while语句若判断条件为真,没有区别,效果一样。若判断条件为假,则前者先执行一遍。
4.for循环:若省略表达式2,表示循环条件为真。
最大公约数:r=m%n;n=r,m=n;一直循环,直到r==0,公约数为n。最小公倍数为两数之积除以最大公约数。
5.break语句和continue:break跳出switch、for、while、do-while,彻底跳出,后面语句不执行。Continue跳出while、for、do-while(没有switch)只跳出1层,后面语句都不执行。
第五章
函数与编译预处理
1.一个程序只能有一个main语句,它是程序入口点函数,函数可以嵌套调用,不可以嵌套定义。
2.实参可以是常量、变量、表达式,只要是一个确定的值就可以。只有开始调用形参时,才会为形参分配内存空间,形参和实参的内存空间是不一样的。
3.return语句返回值,执行到哪个return语句,返回哪个值,它还可以终止函数,return后,return后面语句就不再执行。若return类型和函数定义类型不一样,以函数定义类型为准(自动进行类型转换)。
4. i=2; f (i, ++i+3,++i);实际调用f
(4, 7,3);(从右向左)
若为f(i, ++i+3,i++);实际调用3,6,2.(i++放到后面对传参无影响),计算i值时,先从后面计算(与cout一样)。
5.若被调函数(比如max)在main函数后面实现,则在main函数中对max函数要进行说明,(int
max(int,int)也可以,int max(int x,int y)也可以,但是如果函数原型为int
max(int &x,int &y),也就是有引用时,要写全函数原型:int max(int &x,int &y))。
6.函数的嵌套调用:与main对函数调用相似,也要说明。若在前面,则不用说明。
7.局部变量作用域内,全局变量不起作用。在局部变量的作用域内,用::来引用与局部变量同名的全局变量。如::x。
8,一个程序的内存空间有:程序区(放程序)、静态存储区(静态变量)、动态存储区(动态变量)。局部变量的分类:动态变量(auto),默认,存储在动态区。Register(寄存器变量):在cpu内部存储。静态局部变量(static):存储在静态区。全局变量在另一个文件中可以用extern作声明来引用,在同一个工程中外部变量都是相通可以引用的。函数在外部都可以通过extern引用。当变量名相同致使作用域相重时,起作用的是最近说明的那个变量。全局变量默认值为0。
9.内联函数inline是在函数执行时展开函数体,实质是用存储空间(使用更多的存储空间)来换取时间(减少执行时间)。如:inline
int add(int x,int y);内联函数中不能有do-while、while、for、switch和复杂的if语句。要先定义,后使用,只是请求编译器去扩展实现,并不是命令编译器扩展实现,因此具体扩展还是不扩展由编译器决定。
10.具有缺省参数和参数可变的函数:如int
add(int x=1,int y=2),在调用时add(3),3值赋给x,可以传参,也可以不传参。要把有缺省参数的写到右边。如int
add(int x=1,int y)是错误的,应该y在左边。若函数在main后面定义,在对被调函数说明时,可以不加定义的变量名,直接给类型,如int
add(int,int y=4) ;
11.参数个数可变的函数:
例1 :
#include <iostream.h>
#include <stdarg.h>
int sum( int num, ... )
{
int answer = 0;
va_list argptr;
va_start( argptr, num );
//va_start初始化可变参数
for( ; num > 0; num-- )
{
answer += va_arg( argptr, int ); //va_arg依次取可变参数,要指明参数个数
}
va_end( argptr );
//va_end收尾
return( answer );
}
Void
main( void )
{
int answer = sum( 4, 4, 3, 2, 1 );
cout<<answer<<endl;
}
例2:
include <iostream.h>
#include <stdarg.h>
void my_printf( char *format, ... )
{
va_list argptr;
va_start( argptr, format );
while( *format != '/0' )
{
if( *format == 's' )
{
char* s = va_arg( argptr, char * );
cout<<"Printing a string: "<<s<<endl;
} // character
else if( *format == 'c' )
{
char c = (char) va_arg( argptr, char );
cout<<"Printing a character:"<<c<<endl;
break;
} // integer
else if( *format == 'd' )
{
int d = va_arg( argptr, int );
cout<<"Printing an integer: "<<d<<endl;
}
format++;
}
va_end( argptr );
}
int main( void )
{
my_printf( "sdc", "This is a string", 29, 'X' );
return( 0 );
}
关于上面这个程序:顺序寻找,若为my_printf("sc","This is string",29,'X'),则输出为"This is string",29所表示字符(说明具有自动转换功能),依此类推。此程序注意:1.va_start(vl,p);为p而不是*p.
2.char* ps=va_arg(vl,char *);cout<<ps<<endl;只能通过这种方式,如果cout<<va_arg(vl,char *)<<endl;错误。下面输出int、char也是一样。3.p++; 程序改写switch (*p++)..case也可以。注意在switch中不可以定义变量。注意函数作用域问题:从定义处到对应定义处的}。