C++
C -> C++
更严格的类型检查
C 语言中 const * ->non-const* / void * ->sometype * / type -> type 均是可以的,但是在 C++中则编译通不过。
#include <stdio.h>
#include <stdlib.h>
int main()
{
const int a = 10;
int *pa = &a;
char *p = malloc(100);
int arr[2][3];
int **pArr = arr;
return 0;
}
逻辑类型 bool
C++中 bool 类型是一种逻辑类型,其值只有 true 和 false。
c 语言的逻辑真假用 0 和非 0 来表示。而 C++中有了具体的类型,但其本质,仍是
一个 char 类型的变量可被 0 和非 0 的数据赋值。
#include <iostream>
using namespace std;
int main()
{
bool flag = true;
if(flag)
printf("flag is true\n");
else
printf("flag is flase\n");
printf("sizeof(flag) = %d sizeof(bool) = %d\n",sizeof(flag),sizeof(bool));
flag = 100;
printf("flag = %d\n",flag);
return 0;
}
输出
flag is true
sizeof(flag) = 1 sizeof(bool) = 1
flag = 1
真正的枚举
c 语言中枚举本质就是整型,枚举变量可以用任意整型赋值。
而 C++中枚举变量, 只能用被枚举出来的元素初始化。枚举的常被用来取代宏常量。
#include <iostream>
using namespace std;
enum season {SPR,SUM,AUT,WIN};
int main()
{
enum season s = SPR;
s = 0;//error :invalid conversion from 'int' to 'season'
return 0;
}
可被赋值的表达式
c 语言中表达式通常不能作为左值的,即不可被赋值,C++中某些表达式是可以赋值的。
int main(){
int a ,b= 10;
a = b = 100;
printf("a = %d, b = %d\n",a,b); //a = 100, b = 100
(a = b) = 100; //error :表达式在c语言中是不能作为左值的
printf("a = %d, b = %d\n",a,b);
(a<b? a:b)= 200; //error :表达式在c语言中是不能作为左值的
}
#include <iostream>
using namespace std;
int main(void)
{
int a,b = 5;
(a = b) = 100; //b赋值给a , a=5 , 100赋值给a
cout<<"a = "<<a<<" b = "<<b<<endl; //a = 100 b = 5
(a<b? a:b)= 200; //c++中表达式可以作为左值
cout<<"a = "<<a<<" b = "<<b<<endl; //a= 100 b = 200
return 0;
}
Input&Output 标准输入与输出
cin 和 cout 是 C++的标准输入和输出流对象。他们在头文件 iostream 中定义,
其意义作用类似于 c 语言中的 scanf 和 printf。
流对象 | 含义 | 隐含设备 | 流对象 | 含义 | 隐含设备 |
---|---|---|---|---|---|
cin | 标准输入流 | 键盘 | cout | 标准输出流 | 屏幕 |
cerr | 错误输出流 | 屏幕 | clog | 日志输出流 | 屏幕 |
#include <iostream>
using namespace std;
int main() {
// char buf[20];
// scanf("%s", buf); //不安全
// gets(buf);//不安全
// cin>>buf;//不安全
//更安全的输入字符串
// fgets(buf, 20, stdin);//不安全
string buf;
cin>>buf;
cout<<"buf= "<<buf<<endl;
cout<<"buf size= "<<buf.max_size()<<endl; //buf size= 9223372036854775807
int a;
char b;
cin>>a>>b; //等价于 cin>>a ; cin>>b;
//44 d
//44d
cout<<a<<b<<endl;
return 0;
}
cout 格式输出
c 语言中 printf 拥有强大的格式化控制。C++亦可以实现,略显复杂。
#include <iostream>
#include <iomanip>
//#include <bits/stdc++.h>
using namespace std;
int main() {
int a=12345;
float b=4.5678910;
printf("a = %-8d--\n", a);// 输出 : a = 12345 --
printf("b = %f\n", b); // 输出 : b = 4.567891
printf("b= %10.2f\n",b);// 输出 :b= 4.57
cout<<"a = "<<setiosflags(ios::left)<<setw(8)<<a<<"--"<<endl; //输出 : a = 12345 --
cout<<"b = "<<b<<endl; //输出: b = 4.56789
cout<<"b = "<<setiosflags(ios::fixed)<<setprecision(2)<<setw(10)<<b<<endl;//输出 b = 4.57
return 0;
}
进制输出
#include <iostream>
#include <iomanip>
//#include <bits/stdc++.h>
using namespace std;
int main() {
int a=12345;
printf("%x\n",a);//16进制输出
printf("%o\n",a);//8进制输出
printf("%d\n",a);//10进制输出
cout<<hex<<a<<endl;//输出16进制
cout<<oct<<a<<endl;//输出8进制
cout<<dec<<a<<endl;//默认
cout<<setbase(16)<<a<<endl;//设置16进制
cout<<setbase(8)<<a<<endl;//设置8进制
cout<<setbase(10)<<a<<endl;//设置10进制
#include <bitset>//需引入
cout<<bitset<16>(a)<<endl;//输出16位二进制数
return 0;
}
域宽/对齐/填充
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int a=1234;
cout<<setw(10)<<a<<endl; //输出: 1234
cout<<setw(10)<<setfill('-')<<a<<endl;//输出------1234
cout<<setw(10)<<setfill('-')<<setiosflags(ios::left)<<a<<endl;//输出1234------
cout<<setw(10)<<setfill('-')<<setiosflags(ios::right)<<a<<endl;//输出------1234
return 0;
}