c语言
Dennis Ritchie, Unix
改变“意大利面条式”,引入结构化编程
自顶向下的设计
c99 ANSI C , K&R C
oop
自下向上的设计
c++ bjarne Stroustrup
c++98/03
c++11
保留程序执行窗口的技巧
cin.get();
cin.get();
return 0;
尽可能在首次使用变量前才声明它
头文件climits: INT_MAX CHAR_BIT
sizeof(type_name) 字节数
#define
c风格的创建符号常量的方法,c++建议用const
c++初始化:
int w(432);
int c = {32};
int c{32};
int c{}; //set c to zero
输出控制符:
cout << endl;
cout << hex;//改变之前一直有效
cout << oct;
cout << dec;
后缀:ULL
cout.put('a'); //打印字符
char ch;
cin >> ch;
//输入5,ch变成'5'
int n;
cin >> n;
//输入5,ch变成5
//c++早期,把字符常量存为int形式
char ch = 'M'//截取八位到ch中
cout << '$';//打印ascii码
cout.put('$');//打印字符
wchar_t L'a'
char16_t u'a'
char32_t U'a'
bool ans = -100;//隐式转换
const :c++, ANSI C
cout.setf(ios_base::fixed)
浮点数常量默认类型double
1.2f/F float
1.2l/L long double
123L long
123U unsigned
{}列表初始化,不允许缩窄
整型提升 integral promotion bool等在计算时会转换成int类型再计算
强制类型转换:
(int) a; //c style
int (a); //c++ style 像函数调用
static_cast<typeName> (value) // 更严格
and or not 是c++保留字不能做变量名 不是关键字 c也可以将其用作运算符,只要包含头文件iso646.h
字符处理软件包,继承自c:cctype
switch:char int enum类型
int n;
cin >> n;
当用户输入非数字时:
- n值不变
- 不匹配的输入留在输入队列中
- cin中一个错误标记被设置
- cin方法调用返回false
cin.get(ch) vs cin.get()
属性 | cin.get(ch) | cin.get() |
---|---|---|
传入字符方式 | 赋值给ch | 函数返回 |
字符输入时返回值 | istream对象(bool转换后为true) | int类型 |
EOF时返回值 | istream对象(bool转换后为false) | EOF(-1) |
...
while (!(cin >> golf[i])) {
cin.clear(); //reset input
while (cin.get() != '\n') //get rid of bad input
continue;
cout << "enter another number";
}
...
文件输入输出:fstream头文件
iosteam提供了预定义的cout的ostream对象,但是必须自己声明oftream对象
ofstream outFile;
ofstream fout;
fout.open("a.txt");
char filename[50];
cin >> filename;
fout.open(filename);
fout << "xxx" << endl;
fout.close();
ifstream fin;
fin.open("a.txt");
fin.open(filename);
double wt;
char line[81];
fin >> wt;
fin.getline(line, 81);
fin.is_open();
fin.eof();
fin.fail();
argument实际参数 parameter形式参数
int sum_arr(int arr[], int size);
int sum_arr(int * arr, int size);
//这要求我们必须显示传递数组长度
arr[i] == *(arr + i);
&arr[i] == arr + i;
void show_array(const double arr[], int n);
void show_array(const double * arr, int n);
//不是说原始数组是常量,只是不能在show_array函数中使用arr更改数组
只有当只存在一层间接关系时才能将非const指针赋值给const指针
//一层:
int age = 39;
int * pd = &age;
const int * pt = pd;//可以
//二层
const int **pp2;
int * p1;
const int n = 13;
pp2 = &p1; //假设成立
*pp2 = &n;
*p1 = 10; //修改了n的值!
尽可能使用const:
- 避免无意间修改
- 使用const的函数能处理const和非const实参,否则只能处理非const实参
int g = 1;
int c = 2;
const int * p = &g;
*p = 20; // 错误
p = &c;
int * const p2 = &g;
*p2 = 20;
p2 = &c; //错误
//没用const,因为只能用于指向基本类型的指针
int n = 11;
int* p = &n;
const int** pp = &p;//错误!
//const int** pp2 = (const int **) 0x000000B3B10FF6D4;
const int n = 1;
*pp2 = &n; //
int sum(int arr[][4], int size);
int sum(int (*arr)[4], int size);
//必须指定行数,可以不指定列数
//arr[2]是一个由4个int组成的数组名称
arr[r][c] == *(*(arr + r) + c);
//没用const,因为只能用于指向基本类型的指针
c风格字符串:
- char数组
- 字符串常量""
- 代表字符串地址的char指针
char ch[10] = "abc";
char * str = "aaa";
int n1 = strlen(ch);
int n2 = strlen(str);
int n3 = strlen("abc");
三种类型都是char指针
结构可以正常像基本类型操作,但是如果结构体很大,普通的函数返回会赋值一份降低效率,c处理的方式是传递结构地址,c++则可以按引用传递
()