1 基本数据类型
C/C++语言中的基本数据类型及其属性如下表所示:
类型 |
取值范围 |
大致范围 |
|
整形 |
int |
-2147483648 ~ +2147483647 (即-231 ~ +(231-1)) |
-2*109 ~ +2*109 |
long long |
-263 ~ +263-1 |
-9*1018 ~ +9*1018 |
|
浮点型 |
float |
-2128 ~ +2128 (实际精度6~7位) |
实际精度6~7位 |
double |
-21024 ~ +21024 (实际精度15~16位) |
实际精度15~16位 |
|
字符型 |
char |
-128 ~ +127 |
-128 ~ +127 |
布尔型 |
bool |
0(false) or 1(true) |
0(false) or 1(true) |
2 常量
在C/C++语言中,常量有两种表示方式,分别是:符号常量和const常量。
(1)符号常量:
#define PI 3.14159
(2)const常量:
const double PI = 3.14159;
注意:以上两种方法,都是写在.c/.cpp文件中,方法外部的,一个详细示例如下:
#include <stdio.h> #define PI 3.14 //const double PI = 3.14; int main() { …… }
在PAT、ACM等算法比赛中,建议使用const方法。
3 位运算符
C/C++语言中,位运算符有六种,分别是:左移、右移、位与、位或、位异或、位取反。六种位运算符的详细特性和用法如下表所示。
运算符 |
含义 |
语法 |
效果 |
<< |
左移 |
a << x |
整数a按二进制左移x位 |
>> |
右移 |
a >> x |
整数a按二进制右移x位 |
& |
位与 |
a & b |
整数a和b按二进制对齐,按位进行与运算(除了11得1,其他均为0) |
| |
位或 |
a | b |
整数a和b按二进制对齐,按位进行或运算(除了00得0,其他均为1) |
^ |
位异或 |
a ^ b |
整数a和b按二进制对齐,按位进行异或运算(相同为0,不同为1) |
~ |
位取反 |
~a |
整数a的二进制的每一位进行0变1、1变0的操作 |
4 输入输出
(1)C++语言中的输入输出方式为:cin、cout。
cin、cout的操作不需要关注输入或输出数据的类型。
(2)C语言中的输入输出方式为:scanf()、printf()。
scanf()、printf()的操作需要关注输入或输出数据的类型。对于不同的数据,都需要特定的占位符,才能进行输入或输出。常见几种数据类型在输入、输出时的特征如下表所示。
数据类型 |
占位符 |
输入举例 |
输出举例 |
int |
%d |
scanf(“%d”, &n); |
printf(“%d”, n); |
long long |
%lld |
scanf(“%lld”, &n); |
printf (“%lld”, n); |
float |
%f |
scanf(“%f”, &f); |
printf (“%f”, f); |
double |
%lf |
scanf(“%lf”, &d); |
printf (“%lf”, d); |
char |
%c |
scanf(“%c”, &c); |
printf (“%c”, c); |
字符串(char数组) |
%s |
scanf(“%s”, s); |
printf (“%s”, s); |
其他输出格式:
(1)%md:可以使%d输出的值占m位,贴右侧对齐,不足m位的前面补空格,超出m位的正常显示。
(2)%-md:可以使%d输出的值占m位,贴左侧对齐,超出m位的正常显示。
(3)%0md:可以使%d输出的值占m位,贴右侧对齐,不足m位的前面补0,超出m位的正常显示。
(4)%.mf:可以使%f输出的值具有m位小数位,不足的补0,超出的四舍五入。
getchar()、putchar()、gets()和puts():
getchar()用来获取用户输入的下一个字符;putchar()用来打印一个字符。其用法如下:
char c; c = getchar(); putchar(c);
gets()用来获取用户输入的下一个字符串;puts()用来打印一个字符串。其用法如下:
char str1[20]; char str2[5][10]; gets(str1); gets(str2[0]); puts(str1); puts(str2[0]);
5 typedef
typedef关键字用来给复杂的数据类型起别名。其用法如下:
#include <stdio.h> typedef long long LL; int main(){ LL ll; …… }
6 math.h
math.h是C语言中的数学方法库,使用之前需要先导入这个头文件:#include <math.h>。math方法库中的部分方法及其用法如下:
(1)fabs(double x):该方法用于对double型变量取绝对值。
(2)floor(double x):该方法用于求小于x的最大的整数(对x向下取整)。
(3)ceil(double x):该方法用于求大于x的最小的整数(对x向上取整)。
(4)pow(double r, double p):该方法用于求r的p次方(r和p必须都是double类型)。
(5)sqrt(double x):该方法用于求x的开平方值。
(6)sin(double x):该方法用于求x的正弦值,如45°的正弦值求法为:sin(PI*45/180)。
(7)round(double x):该方法用于求x的四舍五入的值。
7 string.h
string.h是C语言中的字符串方法库,使用之前需要先导入这个头文件:#include <string.h>。string.h方法库中部分方法及其用法如下:
(1)strlen(char[] c):返回字符数组c的长度。
(2)strcmp(char[] c1, char[] c2):比较c1和c2,返回它们的大小比较,1表示c1比c2大,0表示c1和c2一样大,-1表示c1比c2小。
(3)strcpy(char[] c1, char[] c2):将c2中的内容复制到c1中。
(4)strcat(char[] c1, char[] c2):将c2中的内容追加到c1内容的后面。
8 指针和引用
1、指针:
(1)定义一个指针变量:int* a;
(2)获取某个变量的指针:int* p = &a;
(3)获取某个指针变量指向的变量:int a = *p;
(4)获取数组a中的第i个元素:int ai = *(a + i);
2、引用:
(1)对于如下代码:
void swap(int a, int b) { int temp = a; a = b; b = temp; } int main() { int a = 1, b = 2; swap(a, b); printf(“%d,%d”, a, b); return 0; }
对于上面的代码,输出的a和b仍然是1和2,这是因为在C语言中,传入函数的参数都是原来参数的副本,修改副本的值对原值是没有作用的。
为了解决这个问题,可以使用的方法有两种,分别是使用指针和引用。
1)使用指针,代码如下:
void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } int main() { int a = 1, b = 2; int* p1 = &a, *p2 = &b; swap(p1, p2); printf(“%d,%d”, a, b); return 0; }
2)使用引用,代码如下:
void swap(int &a, int &b) { int temp = a; a = b; b = temp; } int main() { int a = 1, b = 2; swap(a, b); printf(“%d,%d”, a, b); return 0; }
通过上面的代码对比可以看出,C语言中的引用可以将原变量传递到函数中去。
9 结构体
1、声明结构体,代码如下:
struct User { int id; char gender; char name[20]; } Alice, stu[200], *p;
2、创建结构体对象,代码如下:
User Alice; User stu[200]; User *p; // 注:如果在声明结构体的时候定义了对象名称,如上1中的Alice等,则不需要再创建对象
3、调用结构体对象中的属性,代码如下:
(1)结构体对象不是指针变量:
Alice.id = 111111; stu[0].gender = ‘f’;
(2)结构体对象是指针变量:
(*p).id = 2222222; (*p).name = “zhangsan”; // 或 p->id = 2222222; p->name = “zhangsan”;
4、为结构体创建构造函数:
struct Point { double x; double y; Point() {} Point(double _x, double _y) { x = _x; y = _y; } } int main() { Point p = Point(20, 20); }