C++教程 - How to C++系列专栏第1篇

关于专栏

这个专栏是优质的C++教程专栏,会保持更新哦

本专栏一致使用操作系统:macOS Ventura,代码编辑器:CLion,C++编译器:Clang

感谢一路相伴的朋友们,感谢你们的支持 ^ _ ^

当然,C++是一门具有可移植性的语言,意味着用Linux和Windows的小伙伴也可以看这篇文章入坑C++了

博主反馈非常及时,如果你在阅读的时候遇到问题,可以直接在评论区提问,博主看到后会在24小时内给你反馈

C++教程 - How to C++系列专栏第1篇


目录

关于专栏

更新记录

2023年8月5日

前言

你的C++预备知识

编译器?G++,Clang是什么?

G++,Clang有什么区别?

可移植性是什么?

C++有标准吗?

扩展名

你的第一个C++

 main函数

函数头

void main()

return 0

语句与分号

C++的注释

结语

快捷翻页

本文参考文章,书籍


更新记录

2023年8月5日

发布第一篇文章


前言

本文将讲述C++的预备知识,什么事编译器?Clang和g++选哪个?C++的可移植性是啥?C++有标准吗?C++的扩展名是什么?第一次写出你的C++程序,了解什么是函数头,一定要有分号吗?注释怎么写?还是“#”吗?


你的C++预备知识

相信大家或多或少都听说过C++,或多或少知道它的应用领域很多

C++自2002年至今几十年来时代发展无比飞速,但其排名一直在前5内。可以看出它在编程语言的地位

只是随着近些年由C/S(客户端/服务端)转向B/S(浏览器/服务端),以及安卓手机的发展,Java一直名列前茅。Python随着爬虫和Django框架在Web开发上的开发效率,以及今年火热的人工智能优势也是火箭式窜升

但我们似乎发现,真正能对C++地位造成威胁的暂时还没有

编程界流行这样一句话:C几乎什么都能做,C++几乎什么都能做好,足见其功能的强大,C++的开发社区也是日益健壮

所以可见C++是一门经久不衰的语言

编译器?G++,Clang是什么?

假如你正在阅读一篇文章,但这篇文章并不是用中文写的,或许有些同学外语好看得懂,但大部分人会把它放到翻译工具里翻译一下

从本质上讲,你只是在翻译中输入了你不理解的语言,翻译将这句话翻译成中文,就像这样:

你不太理解“Cat”是什么意思,于是你打开了翻译,选择了中翻英,然后翻译告诉你这是“猫”的意思

操作系统也看不懂你写的什么,所以它要编译为可执行文件(macOS和Linux同学们知道的.out,Windows同学知道的.exe

G++,Clang有什么区别?

对于现在来说,他们没什么区别,在之后我们可能会讲到不同C++实现的区别,但现在,他们并没有什么区别,本文选择了Clang作为编译器,在macOS,Linux,Windows的同学都可以正常使用同一个编译器,建议你可以和我们一样,这里贴上Clang的下载地址,macOS安装了Xcode Command Line Tools就可以。

可移植性是什么?

C++的可移植性指的是代码能够在不同的平台、操作系统和编译器上编译和运行的能力

大概懂了吧?还不懂?举个例子:

假设你现在在一台MacBook用macOS上写了个汇编的程序,现在需要在一台上面跑着Linux系统的电脑上运行,那么你需要……

你需要重新写一份适合于这个平台的程序(没错会把你搞崩溃,因为你需要学习更多的东西)

但假如换做C++那就不一样,把源码文件传过去,在Linux上编译一下就能用

C++有标准吗?

ISO/IEC 14882:1998就是C++的第一个国际通用标准,后面又有了C++03(ISO/IEC 14882:2003),一般使用C++98,C++03,后面的C++11,C++17,C++20,大家也大概明白是什么意思了吧?

ISO C++标准还吸纳了,ANSI C标准,因为C++一般是C的超集,大概意思就是说,任何C程序都可以在C++那里跑通。

扩展名

他们的扩展名一般为.cpp(C Plus Plus),之后我们的程序也会用.cpp作为结尾


你的第一个C++

first.cpp

#include <iostream>

int main(void)
{
    using namespace std;
    cout << "This is my first C++ program!" << endl;
    cout << "Let's go!"
    cout << endl;
    return 0;
}

 main函数

first.cpp代码的基本结构如下:

int main(void)
{
    code
    return 0;
}

这几行说明:有一个名为main(void)的函数, 并描述了函数的行为

这些代码(上面一个,省略些的)被称为函数定义,定义由函数头和函数体组成,下面依次讲解

函数头

int main(void)

为函数头,其中int代表了它的类型:整型(之后我们会详细讲解,int之后我们会经常说到) ,main被称为函数名,"(void)"表示该函数不接受任何参数,也可以使用空括号"()"两者等效,在《C++ Primer Plus》书中是空括号,两种都可以,加void可能会更直观一些,但大部分已经不加了,这里就遵从大家喜好了。

void main()

看任何C++书的朋友,秉承能救一个是一个的精神,一定给大家郑重声明一点!

看到很多的朋友,main函数都写成void main(),而不是int main()

可能大家看书里说,这两种都是一样的,比如《C++ Primer Plus》中这么说:

有些程序员使用下面的函数头,并省略返回语句:

void main()

这在逻辑上是一致的,因为 void 返回类型意味着函数不返回任何值。该变体适用于很多系统,但由于它不是当前标准强制的一个选项,因此在有些系统上不能工作。因此,读者应避免使用这种格式,而应使用 C++标准格式,这不需要做太多的工作就能完成

在这里告诉大家,void main()的写法根本就是错的,完完全全是错的

main函数的返回值大家注意了吗,也许有人会说可以没有返回值,如果你深入到程序的CRT启动代码,你会发现....

__initenv = envp;
mainret = main(argc, argv, envp);
if ( !managedapp )
   exit(mainret);
if (has_cctor == 0)
   cexit();

按照C99标准,即使函数本身没有定义返回值,编译器也会加上,以返回给激发程序,运行状态。而C与C++中从来没有定义过void main()

C++ 之父 Bjarne Stroustrup 在他的主页上的 FAQ 中明确地写着

The definition void main( ) { /* ... * / } is not and never has been C++, nor has it even been C.

翻译:void main()从来就不存在于 C++ 或者 C 

也就是说,void main()可能能被一些编译器通过,但ISO标准根本就没有定义void main(),在一部分编译器是跑不通的,那么你可能就悲催了:(,使用C++的同学们还是使用int main或者int main(void)

学过C的朋友看这里

C里面有一种写法:

main()

C中省略返回值类型相当于返回值类型为int,但在C++中淘汰了这种用法

return 0

你可能会发现末尾会有一个返回值,它会向操作系统说明,这个程序没有问题,除了0以外的值会被视为错误

语句与分号

语句是要执行的操作。为理解源代码,编译器需要知道一条语句何时结束,另一条语句何时开始。有些语言使用语句分隔符。例如:FORTRAN 通过行尾将语句分隔开来,Pascal 使用分号分隔语句。在 Pascal中,有些情况下可以省略分号,例如 END 前的语句后面,这种情况下,实际上并没有将两条语句分开。不过 C++与 C一样,也使用终止符(terminator),而不是分隔符。终止符是一个分号,它是语句的结束标记,是语句的组成部分,而不是语句之间的标记。结论是: 在 C++中,不能省略分号

学过其他语言的同学可能有点不适应哈

C++的注释

C++使用“//”双斜杠作为注释,注释后面的东西在预编译时就会被去掉,之后我们会在文件头里详细讲解什么是预编译

当然,我们也可以使用C风格的注释,即在/*和*/之间的信息会被注释,学过CSS的同学可能非常熟悉哈哈

学过Python的同学记住注释不是#了,不是了,不是了,不是了


结语

作者会经常帮助有问题的小伙伴解决问题如果你有问题,可以直接到评论区指出,作者会在看到后到24小时内给予答复

如果本文有任何问题欢迎在评论去指出,如果喜欢这篇文章,希望能点赞评论关注

如果你们身边有像你提起过这个领域的,或者希望可以和ta一起进步的,把文章分享给ta吧

4008字,8个父项,4个子项,6个孙子项,2个重孙子项


快捷翻页

博主的其他优质文章:

裁剪一个简单的Linux

Hexo教程,看这一篇就够了- How to系列 

如何在CSDN写高质量博客-How to系列

Apple WWDC23开发者大会——Apple的野心


本文参考文章,书籍

参考文章 

学C++有什么用?C++的未来在哪里? - 知乎

比较C/S、B/S架构之间的区别(原理、优缺点、适用范围)以及主流的Web程序应用平台、Web工作原理_b/s和c/s的区别_MarsYjZ的博客-CSDN博客

https://wenku.csdn.net/answer/18a7406a5b2e4d178d90cda0b3b07288

什么是编译器?为初学者解释 C 语言中的编译器

为什么汇编写的程序可移植性差? - 知乎

如何更好理解C/C++的可移植性? - 知乎

ISO - Search

详解C/C++代码的预处理、编译、汇编、链接全过程 - 知乎 

 Clang 16.0.0 Release Notes — Clang 16.0.0 documentation

[转]void main()还是int main()_c语言中void可以省略吗?_知足--常乐的博客-CSDN博客

参考书籍 

C++ Primer Plus

猜你喜欢

转载自blog.csdn.net/cat_bayi/article/details/132120795