1. 函数调用应在函数声明之后,函数声明可在main上面,也可在main内部,或者在头文件里?
2. C语言头文件以.h结尾,新的ANSI C++推出的编译系统不带.h,C++保持兼容,可并存。
3. C语言无命名空间,因此无需作using namespace说明
4. C语言中,main函数无返回值: void main(){}
C++中,int main(){return 0;}
5. 编译(目标文件 .o/.obj)+库文件和其他目标程序-->连接(汇编)(.exe)
6. C++数据类型:
(a)基本类型
整型:短整型short int 整型int 长整形 long int
字符型:char
浮点型:单精度型float 双精度型double 长双精度型 long double
布尔型:bool
(b)构造类型
枚举类型enum
数组类型
结构图struct
共同体union
类类型class
(c)指针类型
(d)引用类型
(e)空类型
7.数值的表示
020 16 16L 1.6e1
8. 常变量必须在定义时同时给出赋值,不可分开
9. 用#define a = 100为常量,在编译时做替换,内存中不存在常量
用const int a = 100为常变量(本身为变量,用const限制不可修改)
10.不同数据类型运算,先进行类型转换
double<--float
|
long
|
unsigned
|
int<--short, char
横向为必须的转换,从下往上优先级更高(低优先级往高优先级转换)
疑问:int与unsigned做运算,int怎么换为unsigned???
11.类型不匹配的赋值过程
float/double-->int,取整数部分
int-->float/double,以浮点型存储int对应值
double-->float,若数值超出范围,则报错
char-->数值,值为ASCII
int/short/long-->char,取低8位赋值
signed-->unsigned,连带符号位原内容照搬(数值和符号都发生变化)
例如-5赋值给unsigned int,可能变为4294967291
12.赋值运算由右至左执行
例如,a=b=5;相当于b=5;a=b;
再如,a+=a-=a*a,若a初值为12,则首先a-=a*a(a=a-a*a)得到a=-132
然后,a+=a(a=a+a),得到a=2a=-264
13.顺序求职表达式(逗号表达式)
expr1,expr2: 值为expr2的值
例如(a=3*5,a*4),a+5值为65
14.ddd为八进制
xhh为16进制
15.对于输入流,系统会根据变量的类型从输入流中提取相应长度的字节。
例如,char c1,c2; int a; float b;
cin>>c1>>c2>>a>>b;
输入1234 56.78
则,c1='1';c2='2';a=34;b=56.78;
16.输出流格式(引用头文件<iomanip>)
默认cout输出流有效位数为6,可以通过cout<<setprecision(9)设置有效位数为9;
cout<<setiosflags(ios::fix);固定小数位输出(默认6位小数位)
cout<<setiosflags(ios::fix)<<setprecision(8);8位有效小数位
cout<<setiosflags(ios::scientific)
17.getchar()与putchar()用于输入输出单个字符
putchar('a');
putchar(90);
18. 函数原型:函数声明,通知编译系统,以对包含函数调用的语句进行编译时进行对照。不需要参数名。
float add(float,float);
19.内联函数(内置函数)inline function:将调用函数的代码直接嵌入到主调函数中,避免了函数调用保存现场及恢复现场等开销。
函数之前加inline
inline只是给编译系统的一个建议,规模小且被频繁调用的简单函数(无switch、循环语句),才能用inline声明,否则编译系统会忽略inline声明,按普通函数处理
20.函数重载:函数名相同,参数不同,按照多个不同函数调用
21.函数模板:泛型??
template<typename T>;
T max(T a, T b);
22.内存中用户使用的存储空间:
(1)程序区
(2)静态存储区
(3)动态存储区
全局变量存储在静态存储区,在程序开始时给全局变量分配存储空间,在程序执行过程中占用固定的存储单元,而不是动态的分配和释放。
动态存储区:形参,局部变量,现场保护
23.C++中变量的除了数据类型属性之外,还有存储类别(storage class)
存储方法分为静态存储和动态存储,具体分为自动【(auto)】、静态【staic】、寄存器【register】和外部【extern】
23.静态局部变量赋初值是在编译时进行,若在定义时不赋值,编译时自动赋值0或空字符
24.寄存器变量存放在寄存器中,避免了每次都要内存中存取。对于使用十分频繁的变量,可以在声明为寄存器变量(例如次数较多的while循环)。
register int i;
eg.
register double sum = 0;
register int i=0;
register int j=0;
for(i=0;i<100000;i++)
{
for(j=0;j<i;j++)
{
sum+=i;
}
}
用时5.2s
double sum = 0;
int i=0;
int j=0;
for(i=0;i<100000;i++)
{
for(j=0;j<i;j++)
{
sum+=i;
}
}
用时16.91s
25.extern 外部变量声明
适合提前声明本文件中在引用处之后内容中定义的两边,或者在外部其他文件中定义的变量。
26.对于全局变量,不同文件中不可使用相应命名,否则会报错multiple definition
27.静态全局变量作用于仅限本文件,其他文件中不可通过extern方式引用
因此,为了保护本文件中的全局变量,可以加上static
28.静态全局变量和全局变量都是存放在静态存储区,但是作用域不同。前者仅限本文件,不同文件可以重名;后者可以通过extern扩展作用域,且不可
同名。
29.内部函数:static,只有文件内部可以调用;
外部函数:(extern),可以被外部调用
调用外部函数时,先(extern) func()声明一下
30.为什么要#include头文件??
include操作会将该头文件的所有内容拷贝加入当前的文件,而头文件中包含了外部函数声明以及外部变量声明,而本文件中用到了外部的一些函数(库),因此需要函数原型声明
31.预处理不属于C++语言本身的内容,是编译之前的一个环节
预处理:宏定义define、条件编译ifdef、文件包含include
32.内联函数inline需要和主调函数放在一个文件,因此放在头文件中比较合适
33.通常,include系统库不使用.h,自定义头文件使用.h
34.条件编译:根据一定条件选择某些代码编译或不编译
35.数组在内存中占据连续的存储空间
数组定义时使用的长度必须是常量表达式
36.数组定义
int a[10]={0,1,2,3,4,5,6,7,8,9};
int a[10]={0,1,2,3,4,5};//未定义部分默认0,长度为10
int a[]={0,1,2,3,4};//长度为5
int a[][4] = {{1,2,3,4},{5,6,7,8}};
int a[][3] = {{0,1,2},{},{3,4,5}}; //3*3
char s[10] = {'a','b','c','d','e'}; //未定义部分默认' '