C++的第一个程序
cpp
#include<stdio.h>
int main()
{
printf("Hello World!\n");
return 0;
}

这是我们使用的c++的编译器写的c语言的"Hello World!",说明c++的编译器可以兼容c语言的语法
那我们来看一下用c++写的"Hello World!"
cpp
#include <iostream>
using namespace std;
int main() {
cout << "Hello World!" << endl;
return 0;
}
iostream是什么?
iostream 是 C++ 标准库中的一个头文件, 它的全称是 Input/Output Stream(输入/输出流)
在 C++ 中,数据的输入和输出被抽象为"流"的概念:
-
输入流 (Input Stream):数据从外部设)流向内存
-
输出流 (Output Stream):数据从内存流向外部设备
C++ 语言本身并不包含处理输入输出的关键字。如果没有 iostream,你的程序将是一个"黑盒":它能计算,但无法告诉你结果,也无法接收你的指令,通过引入这个头文件,编译器才知道如何调用底层的系统接口来显示字符或读取
std是什么?
std 是英文单词 Standard (标准)的缩写。它是 C++ 标准库 (Standard Library)专属的命名空间
C++ 官方委员会定义的所有功能(比如打印文字的 cout、读取输入的 cin、生成随机数的 rand 等)都被统一打包放在这个名为 std 的"大箱子"里
namespace命名空间
想象一下,如果你所在的学校有两个学生都叫"小明",当老师在走廊大喊"小明"时,两个学生都会回头,这就产生了命名冲突
cpp
#include <iostream>
using namespace std;
int rand = 10;
int main()
{
cout << rand << endl;
return 0;
}
在编译器中的"cout << rand << endl;"里面的rand是有红色波浪线 的,rand在cpp中是**生成一个伪随机整数,**但是现在我用rand的定义了一个整型的变量就会产生冲突编译器就不知道rant的具体作用是什么?但是如果我们加上命名空间去定义rand的效果就不一样

cpp
#include <iostream>
using namespace std;
namespace space //命名空间的名称可以自定义,我这里是space
{
int rand = 10;
}
int main()
{
cout << rand << endl;
return 0;
}

现在我们就已经能正确的编译我们的代码但是输出的结果好像不是我们定义的数据,是一块内存地址 ,这是因为在代码开头写了 using namespace std;这相当于把 std 空间里的所有东西都释放到了全局范围,包括标准库里的 **rand 函数,**这样会打印rand函数在内存中的地址,那我们在命名空间中已经定义了rand,那我们怎么才能把rand的数据输出呢?
"::"(域作用限定符)访问域中的成员
编译查找一个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间里面去查找,我们只需要在输出的内容前面加上域名和"::"就可以了
cpp
#include <iostream>
using namespace std;
namespace space
{
int rand = 10;
}
int main()
{
cout << space::rand << endl;
return 0;
}

由于如果单纯访问一个变量 ,只会在局部或者全局中查找,如果没有则访问失败,而 namespace 这个域又是不同与这两个域的另一种域,这样的话我们如果想要访问到 namespace 里面的成员,就需要借助 :: 了
cpp
#include<stdio.h>
namespace A
{
int rand = 10;
}
int rand = 20;
int main()
{
int rand = 30;
printf("%d\n", rand);
printf("%d\n", ::rand);
printf("%d\n", A::rand);
return 0;
}

1.局部变量:int rand = 30;
-
位置 :在
main函数内部。 -
特性 :这是离
printf最近的变量。在 C++ 中,遵循就近原则(Local scope takes precedence)。 -
访问方式 :直接写
rand。 -
结果 :第一个
printf输出 30。
- 全局变量:
int rand = 20;
-
位置:在所有函数和命名空间之外。
-
特性 :它属于全局作用域。
-
访问方式 :使用作用域解析运算符
::(前面不加任何名字)。这个符号告诉编译器:"跳出当前函数,去全局最外层找"。 -
结果 :第二个 printf输出 20。
- 命名空间变量:
A::rand = 10;
-
位置 :被包裹在
namespace A这个特定的"抽屉"里。 -
特性:它被物理隔离了,不会和外面的人打架。
-
访问方式 :必须指名道姓,写成
A::rand。 -
结果 :第三个
printf输出 10
为什么这次没有输出"内存地址"?
你可能注意到了,这次我用了 #include <stdio.h>
-
在之前的例子中,我用了
using namespace std;并且包含了<iostream>,这导致了标准库的rand函数进入了我的视线 -
而在这段代码里,我没有引用
std命名空间,且printf强制要求格式化输出,在<stdio.h>中没有rand函数 -
更重要的是,我在全局和局部都显式定义 了
int rand,根据 C++ 的规则,局部定义的变量会"屏蔽"掉同名的全局函数或变量
命名空间的嵌套
cpp
#include <iostream>
using namespace std;
namespace space
{
int rand = 10;
namespace box
{
int boxing = 20;
}
}
int main()
{
cout << space::rand << endl;
cout << space::box::boxing << endl;
return 0;
}

C++输入输出
在 C++ 中,所有的输入输出都是通过"流"来完成的。我们需要包含 <iostream> 头文件,并使用 std 命名空间
数据的"流入"与"流出"
C++ 使用两个非常形象的运算符:
-
提取符 (
>>):从输入流中"提取"数据存入变量 -
插入符 (
<<):将数据"插入"到输出流中打印出来
cpp
#include <iostream>
using namespace std;
int main()
{
int age;
cin >> age;
cout << age;
return 0;
}

"cin"就表示提取到"流","cout"就是输出"流",那如果我们多输入几个会怎么样?
cpp
#include <iostream>
using namespace std;
int main()
{
int age1,age2,age3;
cin >> age1>>age2>>age3;
cout << age1<<","<<age2<<","<<age3;
return 0;
}

那如果我们不想打开"std"的话,怎么输出?
cpp
#include <iostream>
int main()
{
int age1,age2,age3;
std::cin >> age1>>age2>>age3;
std::cout << age1 << "," << age2 << "," << age3 << std::endl;
return 0;
}
我们就可以在输入输出前面加"std::"
那"endl"是什么意思?
endl 的双重身份
- 换行 (
\n)
这是大家最熟悉的,它会将光标移到下一行的开头。
- 刷新缓冲区 (
flush)这才是重点
这是 endl 与普通换行符 \n 最大的区别
-
什么是缓冲区? 为了提高性能,C++ 不会你每输出一个字符就往屏幕(或磁盘)上写一个字符。相反,它会先在一个内存区域(缓冲区)里攒着,等到攒够了一定数量,再一次性"倒"出来。
-
flush 的作用 : 执行
flush就相当于下达了命令:"别等了,现在立刻马上把缓冲区里的所有东西都吐出来 -
这里大家就暂时想成换行符
