目录
环境设置
C++语言环境需要文本编辑器和C++编译器。
vim/vi文本编辑器适用于linux 或unix,检查是否安装相应编译器GCC。
$ g++ -v //检查是否安装GNU编译器
已经安装,会显示
Using built-in specs.
Target: i386-redhat-linux
Configured with: ../configure --prefix=/usr .......
Thread model: posix
gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)
如果未安装 GCC,那么 http://gcc.gnu.org/install/
程序 g++ 是将 gcc 默认语言设为 C++ 的一个特殊的版本,链接时它自动使用 C++ 标准库而不用 C 标准库。
$ gcc main.cpp -lstdc++ -o main //设置c++为默认语言
编译一个C++程序
$ g++ helloworld.cpp //未指定可执行程序的文件名,默认生成a.out
$ ./a.out
Hello, world!
$ g++ helloworld.cpp -o helloworld //或者使用-o指定生成可执行文件的文件名
$ ./helloworld //执行helloworld
Hello, world!
$ g++ helloworld1.cpp helloworld2.cpp -o helloworld
//多个C++文件可生成一个可执行文件
基本语法
C++每个语句以分号结束,语句块在{ }中。
C++不以行末作为结束符的标识,一行可有多个语句。
C++标识符,即变量、函数、类或模块名,以字母开头或以下划线_开头,后跟字母数字下划线,区分大小写。
注释,//单行注释,/* */用于多行注释。
数据类型
布尔型bool,字符型char,整型int,浮点型float,双浮点型double,无类型void,宽字符型wchar_t。
char,int,double可以使用一个或多个类型修饰符进行修饰:
修饰符 signed、unsigned、long 和 short 可应用于整型,signed 和 unsigned 可应用于字符型,long 可应用于双精度型。
修饰符 signed 和 unsigned 也可以作为 long 或 short 修饰符的前缀。例如:unsigned long int。
C++ 允许使用速记符号来声明无符号短整数或无符号长整数。您可以不写 int,只写单词 unsigned、short 或 unsigned、long,int 是隐含的。
无符号短整数 50,000 的位模式被解释为有符号短整数 -15,536。
print---cout
cout为C++中的print,<< 运算符用于向屏幕传多个值,\t即tab一段空白,endl为换行符即\n。
cout << "float: \t\t" << "所占字节数:" << sizeof(float);
cout << "\t最大值:" << (numeric_limits<float>::max)();
cout << "\t最小值:" << (numeric_limits<float>::min)() << endl;
枚举
如果一个变量有几种可能存在的值,就可以定义为枚举类型。枚举在C/C++中,是一个被命名的整型常数的集合。
enum 枚举名{
标识符[=整型常数], //默认为0,之后每一个数值加一,也可自行写数值初始化
标识符[=整型常数], //几个枚举量的值可以相同
...
标识符[=整型常数]
} 枚举变量;
enum color { red, green, blue } c;
c = blue;
c=yellow; //错误,不可将非枚举量赋值给枚举变量
int a = color(2); //正确,枚举量可赋值给非枚举变量
枚举量不可进行算术运算,red++; c = red+green;//不可
枚举量可参与运算,int a= 1+red;//枚举量red会被赋值编译器转为整数
局部变量和全局变量
在程序中,局部变量和全局变量的名称可以相同,但是在函数内,局部变量的值会覆盖全局变量的值。
当局部变量被定义时,系统不会对其初始化,您必须自行对其初始化。定义全局变量时,系统会自动初始化为下列值:
数据类型 初始化默认值 int 0 char '\0' float 0 double 0 pointer NULL
整数常量
前缀0x/0X表示十六进制,0表示八进制(0-7),无前缀则表示十进制。
后缀是U和L的组合,无符号整数或长整数,大小写都可,顺序任意。
212 // 合法的
215u // 合法的
0xFeeL // 合法的
078 // 非法的:8 不是八进制的数字
032UU // 非法的:不能重复后缀
85 // 十进制
0213 // 八进制
0x4b // 十六进制
30 // 整数
30u // 无符号整数
30l // 长整数
30ul // 无符号长整数
浮点常量
整数部分,小数点,小数部分和指数部分。
3.14159 // 合法的
314159E-5L // 合法的
布尔常量
true false
转义序列
转义序列 | 含义 |
---|---|
\\ | \ 字符 |
\' | ' 字符 |
\" | " 字符 |
\? | ? 字符 |
\a | 警报铃声 |
\b | 退格键 |
\f | 换页符 |
\n | 换行符 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符,和\t效果似乎一样 |
\ooo | 一到三位的八进制数 |
\xhh . . . | 一个或多个数字的十六进制数 |
字符串常量
定义常量
#define identifier value //名字+值
#define LENGTH 10 //常量定义大写比较好
#define WIDTH 5
const type variable = value;//类型+名字+值
// const 类型的对象在程序执行期间不能被修改改变。
const int LENGTH = 10;
const int WIDTH = 5;
const char NEWLINE = '\n';
存储类auto
声明变量时根据初始化表达式自动推断该变量的类型。
auto f=3.14; //double auto
s("hello"); //const char*
存储类register
存储类static
通常,在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。但有时候我们需要在两次调用之间对变量的值进行保存。
通常的想法是定义一个全局变量来实现。但这样一来,变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。
静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。
存储类extern
用于当有两个或多个文件共享相同的全局变量或函数的时候。
C++运算符
算术运算符:+-*/%++--加减乘除取余自增自减一。
关系运算符:==;!=;>;<;>=;<=。
逻辑运算符: &&与,||或,!给&&或||取反。
位运算符:&与,|或,^异或(不同取1),~按位取反,<<左移右补零,>>右移左补0或 1(负数)。
赋值运算符:
= | 简单的赋值运算符,把右边操作数的值赋给左边操作数 | C = A + B 将把 A + B 的值赋给 C |
+= | 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数 | C += A 相当于 C = C + A |
-= | 减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数 | C -= A 相当于 C = C - A |
*= | 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数 | C *= A 相当于 C = C * A |
/= | 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数 | C /= A 相当于 C = C / A |
%= | 求模且赋值运算符,求两个操作数的模赋值给左边操作数 | C %= A 相当于 C = C % A |
<<= | 左移且赋值运算符 | C <<= 2 等同于 C = C << 2 |
>>= | 右移且赋值运算符 | C >>= 2 等同于 C = C >> 2 |
&= | 按位与且赋值运算符 | C &= 2 等同于 C = C & 2 |
^= | 按位异或且赋值运算符 | C ^= 2 等同于 C = C ^ 2 |
|= | 按位或且赋值运算符 | C |= 2 等同于 C = C | 2 |
Exp1 ? Exp2 : Exp3;
其中,Exp1、Exp2 和 Exp3 是表达式。如果 Exp1 为真,则计算 Exp2 的值,结果即为整个 ? 表达式的值。如果 Exp1 为假,则计算 Exp3 的值,结果即为整个 ? 表达式的值。
参考菜鸟教程: C++ 函数 | 菜鸟教程 (runoob.com)