2. 基本语法

1. 程序入口

在 C++ 标准中,main 函数是程序启动后调用的第一个用户定义函数,它有两种标准的定义形式:

  1. int main():这种形式表示 main 函数不接受任何命令行参数。它向调用者返回一个整数值,用于表示程序的退出状态。通常,返回值 0 表示程序正常结束,非零值表示程序出现异常或错误。
  2. int main(int argc, char *argv[]):这种形式允许程序接收命令行参数。argc 是一个整数,表示命令行参数的数量(包括程序名本身);argv 是一个指向字符指针数组的指针,每个字符指针指向一个命令行参数的字符串,其中argv[0]是启动进程进程的命令。同样,该函数也返回一个整数值作为程序的退出状态。
    返回值:虽然 main 函数的返回类型是 int,但在 C++ 中,如果 main 函数执行到末尾时没有显式地使用 return 语句,编译器会隐式地插入 return 0;,这意味着程序默认以正常状态退出。不过,为了代码的可读性和可维护性,建议显式地添加 return 语句。

2. 命名规范

  • 文件名:小写蛇形
  • 类名:大驼峰
  • 数据类型:大驼峰
  • 变量:小写蛇形
  • 全局变量:g_开头
  • 命名空间:小写蛇形
  • 函数名:小驼峰
  • 枚举名:大驼峰
  • 宏变量:大蛇形

3. 类型别名

<span class="tag">#include</span><iostream>
<span class="tag">#include</span> <limits>

using namespace std;
typedef long int intsize8;  // 类型别名
int main()
{
intsize8 count = 0;
# size: 8
cout << "size: " << sizeof(count) << endl;
return 0;
}

4. 枚举类型

<span class="tag">#include</span><iostream>
<span class="tag">#include</span> <limits>

using namespace std;
enum Color {
red,
green=5,
yellow,
};

int main()
{
// red value: 0 green value: 5 yelow value: 6
cout << "red value: " << red << " green value: " << green << " yelow value: " << yellow << endl;
}

5. 流运算符

<<>>是用于位移运算符,在标准库中,std::coutstd::cin 分别是 std::ostreamstd::istream 类型的对象。为了能让这些流对象可以处理不同类型的数据(如 intdoublechar 等),标准库对 <<>> 运算符进行了大量的重载。这样就能把不同类型的数据插入到输出流中。例如,对于字符串类型const char*<< 运算符会把字符串的内容输出到控制台;对于整数类型(int),<< 运算符会把整数的十进制表示输出到控制台。

<span class="tag">#include</span> <iostream>

int main() {
    int num = 10;
    double d = 3.14;
    char ch = 'A';

    std::cout << "整数: " << num << std::endl;
    std::cout << "浮点数: " << d << std::endl;
    std::cout << "字符: " << ch << std::endl;

    return 0;
}

<< 主要用于将数据插入到输出流中。具体解释如下:

  • std::cout:这是 C++ 标准库中定义的标准输出流对象,它与控制台屏幕相关联,主要用于向控制台输出数据。
  • << 运算符:它会把右侧的数据插入到左侧的输出流对象中。当你使用 std::cout << "This is a custom cout function." 时,字符串 "This is a custom cout function." 就会被插入到 std::cout 输出流里,进而显示在控制台上。
  • 链式使用<< 运算符支持链式调用,也就是说你可以连续使用多个 << 运算符,像 std::cout << "This is a custom cout function." << std::endl; 这样。这行代码会先把字符串插入到输出流,接着把 std::endl 插入到输出流。std::endl 是一个操纵符,它的作用是插入换行符并刷新输出缓冲区。

>> 作为流提取运算符,主要用于从输入流中读取数据并将其存储到变量中。>> 运算符是一个二元运算符,它从左侧的输入流对象(如 std::cin 或文件输入流对象)中提取数据,并将提取的数据存储到右侧的变量中。输入流可以是标准输入(键盘输入)、文件输入等。该运算符会根据右侧变量的类型来解析输入数据。

<span class="tag">#include</span> <iostream>

int main() {
    int num;
    double d;
    char ch;

    // 从标准输入读取一个整数
    std::cout << "请输入一个整数: ";
    std::cin >> num;

    // 从标准输入读取一个浮点数
    std::cout << "请输入一个浮点数: ";
    std::cin >> d;

    // 从标准输入读取一个字符
    std::cout << "请输入一个字符: ";
    std::cin >> ch;

    // 输出读取到的数据
    std::cout << "你输入的整数是: " << num << std::endl;
    std::cout << "你输入的浮点数是: " << d << std::endl;
    std::cout << "你输入的字符是: " << ch << std::endl;

    return 0;
}

6. extern关键字

  1. 共享全局变量:当你在一个源文件中定义了一个全局变量,而在另一个源文件中需要访问这个变量时,就需要在第二个文件中声明这个变量,并使用extern关键字。
  2. 函数声明:当在某个源文件中定义了一个函数,并希望在另一个源文件中调用它时,同样需要在调用它的文件中声明这个函数,并可以使用extern关键字(虽然在C/C++中通常省略extern,仅使用函数原型声明也是可以的)。
  3. 链接属性extern关键字还可以用来控制变量或函数的链接属性。例如,可以使用extern "C"在C++代码中声明C语言的函数,以便正确链接。

详细研究下。。。。。。。

b.cpp

<span class="tag">#include</span><iostream>
<span class="tag">#include</span> "a.h"

using namespace std;

// 也可以不通过引头文件的方式,直接声明外部变量或函数引用
// extern int global_var;
// extern void global_say_hello(); // 声明 global_say_hello
// void global_say_world(); // 声明 global_say_world,可以省略extern

int main()
{
cout << global_var << endl;
global_say_hello();
global_say_world();
}

a.h

<span class="tag">#ifndef</span> GLOBALS_H
<span class="tag">#define</span> GLOBALS_H

extern int global_var;   // extern不可省略
extern void global_say_hello(); // extern可省略
extern void global_say_world(); // extern可省略
<span class="tag">#endif</span> // GLOBALS_H
 
// <span class="tag">#ifndef</span>, <span class="tag">#define</span>, <span class="tag">#endif</span> 来防止头文件被重复包含

a.cpp

<span class="tag">#include</span><iostream>
using namespace std;

int global_var = 1;
void global_say_hello() {
cout << "hello" << endl;
}

void global_say_world() {
cout << "world" << endl;
}

7. include

  • <>:用于包含系统标准库头文件,编译器仅在标准库目录和内置包含路径中查找。
  • "":用于包含用户自定义的头文件,编译器先在当前源文件所在目录查找,若未找到再去标准库目录和内置包含路径中查找。