现在的位置: 首页 > 综合 > 正文

谭浩强C++笔记(1-6章)

2013年02月06日 ⁄ 综合 ⁄ 共 6298字 ⁄ 字号 评论关闭

第二章
数据类型、运算符与表达式

1.一个有符号char型的数据的范围为-128~+127,占用1个字节(8位),无符号的char型数据范围为0~255.
)‘/87’(
改为‘/x87’后输出?因为‘/x87’代表是一个字符,即应该输出135表示的字符,系统找不到这个字符,故输出?)

int型(一般实际中用的多为4字节),无符号范围为:-2147483648~214748364735u表示35)。有符号范围为:无符号范围为:0~429496729510位数)Short
 int型(2字节)无符号范围为:-32768~+32767,有符号范围为0~65535.long
int
也占用4字节(如34L34l)。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++语言是一种强类型的语言,即区别大小写。因此INTFLOAT也可以用来做变量名。

3.不同类型的整型数据传递规律只有一条,按内存中存储格式直接传送。

4.小数指数方式有如1234e+40.005e-3e后面要是整数。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 c12字节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
asizeof:4,无strlen项(此项只能在字符串中拥有)。

6.标识符常量:#defineconst两种。例:#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++)+jcout时从最后面的语句开始。

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>>icin>>oct>>icin>>dec>>i8进制和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后加上breakDefault语句也可以省略,这时若不满足条件什么也不执行。Case后为常量,为整型和字符型都可以。

3.do-while
语句和 while语句若判断条件为真,没有区别,效果一样。若判断条件为假,则前者先执行一遍。

4.for循环:若省略表达式2,表示循环条件为真。

最大公约数:r=m%n;n=r,m=n;一直循环,直到r==0,公约数为n。最小公倍数为两数之积除以最大公约数。

5.break语句和continuebreak跳出switchforwhiledo-while,彻底跳出,后面语句不执行。Continue跳出whilefordo-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-whilewhileforswitch和复杂的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中不可以定义变量。注意函数作用域问题:从定义处到对应定义处的}。

抱歉!评论已关闭.