数据类型
整型常量
八进制整常量的数字部分要以数字0开头
十六进制整常量的数字要以0x开头
整型常量可以用后缀字母L(l)表示长整型,后缀字母U(u)表示无符号型
unsigned
signed和unsigned可以用来修饰char型和int型,不能修饰bool、float、double和long double。不能修饰浮点数是因为unsigned 的意思就是把内存中的数据第一位也用来表示数据,而不用于表示符号位。而浮点数规定内存中数据的第一位必须是符号位。因此两者之间是互相矛盾的,这也就是为什么浮点数不会有unsigned类型。
实型常量(实数或浮点数)
对于整型数,如不采用后缀说明符,默认为int类型,L表示长整型;对于浮点数,不加后缀标识符默认类型为double类型,对于单精度浮点数要加"F"后缀。
符号常量
符号常量
声明语句:
const 数据类型说明符 常量名=常量值;
符号常量在声明时一定要赋初值,而在程序中间不能改变其值。
参考:https://www.runoob.com/cplusplus/cpp-constants-literals.html
自定义数据类型
共用体
union
union 共用体类型名 {
成员列表
};
枚举类型
enum 枚举类型名 {命名枚举常量列表};
例如:
enum DAYS {MON,TUE,WED,THU,FRI,SAT,SUN};
DAYS是枚举类型,MON等是命名枚举常量。默认时枚举常量总是从0开始,后续的枚举常量总是前一个的枚举常量加一。如MON为 0,TUE为1,……,SUN为6。
typedef
可以用typedef声明一个新类型名来代替已有类型名,其形式为:
typedef 已有类型名 新类型名;
其中已有类型名必须是已存在的数据类型的名称,新类型名是标识 符序列,习惯上用大写标识;如果是多个新类型名,用逗号(,) 作为间隔。最后以分号(;)结束。例如:
typedef unsigned char BYTE; //按计算机汇编指令习惯规定的字节型
typedef unsigned short WORD; //按计算机汇编指令习惯规定的字类型
typedef unsigned long DWORD; //按计算机汇编指令习惯规定的双字类型
运算
++i和i++的区别
i++ 即后加加,原理是:先自增,然后返回自增之前的值
++i 即前加加,原理是:先自增,然后返回自增之后的值
++i返回的是i本身而i++返回的是数值。
因此++(++i)是正确的而(i–)–是错误的
单独使用的时候是没有区别的,但是如果当成运算符,就会有区别了
用a=i++和a=++i举例说明
1.a=i++,这个运算的意思是先把i的值赋予a,然后在执行i=i+1;
当i初始等于3时,执行a=i++,最终结果a=3,i=4
2.而a=++i,这个的意思是先执行i=i+1,然后在把i的值赋予a;
当i初始等于3时,执行a=++i,最终结果a=4,i=4
所以说两者参与运算时的区别就是:
a=i++ , a 返回原来的值a=i,i=i+1;
a=++i , a 返回加1后的值,a=i+1,i=i+1。
也就是i++是先赋值,然后再自增;++i是先自增,后赋值。
第二个区别就是: i++ 不能作为左值,而++i可以。
i++是先用临时对象保存原来的对象,然后对原对象自增,再返回临时对象,不能作为左值;++i是直接对于原对象进行自增,然后返回原对象的引用,可以作为左值。
由于要生成临时对象,i++需要调用两次拷贝构造函数与析构函数(将原对象赋给临时对象一次,临时对象以值传递方式返回一次);
++i由于不用生成临时变量,且以引用方式返回,故没有构造与析构的开销,效率更高。
所以在使用类等自定义类型的时候,应尽量使用++i。
参考:彻底搞懂i++和++i的区别,谁的效率更高?
scanf
scanf遇到空格、回车和Tab键都会认为输入结束,所以它不能接收空格
//输入十进制的数
int a;
scanf("%d",&a);
scanf("%i",&a);
scanf("%u",&a);
//这三种写法都是可以的
//输入字符和字符串
char d;
string dd;
scanf("%c",&d); //单个字符
scanf("%s",&dd); //字符串
printf
printf("字符为 %c \n", ch);
printf("字符串为 %s \n" , str);
printf("浮点数为 %f \n", flt);
printf("整数为 %d\n" , no);
printf("双精度值为 %lf \n", dbl);
printf("八进制值为 %o \n", no);
printf("十六进制值为 %x \n", no);