我是编程新手,虽然我已经教自己Python大约一年了,我不久前学过C#.
这个月我在我的大学开始了C++编程课程,我只想问; "为什么C++代码如此复杂?"
写"你好世界".在Python中就像"打印'Hello world.'"一样简单,但在C++中它是:
# includeusing namespace std; int main () { cout << "Hello world."; return 0; }
我知道这可能是一个很好的理由但是,为什么......
...你每次都要包括
...标准库的相同问题,何时不需要std ::*?
......是一个功能的"主要"部分?你有没有打电话给主要功能?为什么是整数?为什么C++需要一个main函数但Python不需要?
你需要"std :: cout <<"吗?与Python相比,这不是那么漫长而复杂吗?
......即使你永远不会使用它,你还需要返回0吗?
这可能是因为我正在学习这样的基本C++,但到目前为止我所做的每个程序都是这样的,所以我必须一遍又一遍地重新输入相同的代码.这不是多余的吗?编译器本身无法输入此代码,因为它总是相同的(即afaik总是包含
C++是一种更低级的语言,在没有解释器的上下文的情况下执行.因此,它有许多不同于Python的设计选择,因为C++没有可依赖的环境来管理类型和内存等信息.C++可用于编写操作系统内核,除了程序本身之外,机器上没有代码运行,这意味着语言(某些库设施不适用于所谓的独立实现)必须是自包含的.这就是为什么C++没有与Python相同的东西eval
,也不是确定类的成员等的方法,也不是需要执行环境的其他特性(或者程序本身的大量开销而不是这样的环境)
对于您的个人问题:
你
每次都要包括吗?你有没有需要它?
#include
是将
标头导入程序的指令.
包含标准输入/输出对象 - 特别是cout
.如果您没有使用标准I/O对象(例如,您只使用文件I/O,或者您的程序使用GUI库,或者正在编写操作系统内核),则不需要
同样的标准库问题,什么时候不需要std ::*?
std
是包含所有标准库的命名空间.using namespace std;
有点像from std import *
,而#include
指令(在这方面)更像是准确的import std
陈述.(实际上,机制是相当不同的,因为C++不using namespace std;
用于自动查找对象std
; using-directive只将名称导入全局名称空间.)
我在这里要注意,using-directives(using namespace
)经常在C++代码中不受欢迎,因为它们导入了很多名称,并且可能导致名称冲突.using std::cout;
尽可能使用using-declarations(),因为它限制了using指令的范围(例如,限制为一个函数或一个源文件).using namespace
没有充分理由不要放入标题.
是一个功能的"主要"部分?你有没有打电话给主要功能?为什么是整数?为什么C++需要一个main函数但Python不需要?
main
是程序的入口点 - 执行开始的地方.在Python中,该__main__
模块具有相同的用途.C++不像Python那样执行定义函数之外的代码,因此它的入口点是函数而不是模块.
你需要"std :: cout <<"吗?与Python相比,这不是那么漫长而复杂吗?
std::cout
只有在不cout
通过using-directive(using namespace std;
)或using-declaration(using std::cout
)将名称导入全局名称空间时才需要.在这方面,它再一次像Python import std
和from std import *
或之间的区别from std import cout
.
它<<
是标准流对象的重载运算符.cout << value
调用cout
函数输出value
.Python不需要这样的额外代码,因为print
它内置于语言中; 这对于C++来说没有意义,因为C++甚至可能没有操作系统,更不用说I/O库了.
即使你永远不会使用它,你还需要返回0吗?
号main
(并且没有其他功能)具有一个隐含的return 0;
在末端.main
(或者,如果exit
函数被调用,则传递给它的值)的返回值作为退出代码传递回操作系统.0表示程序已成功执行 - 它没有遇到错误等.如果遇到错误,则应返回(或传递给exit
)非零值.
在帖子的最后回答你的问题,它可以用C++的哲学概括:
你不支付你不使用的东西.
你并不总是需要使用stdin或stdout(Windows/GUI应用程序?),也不总是使用STL,你编写的所有东西都不一定使用标准main(winAPI)等.正如之前的海报所说,C++比Python低.您将接触到更多细节,这可以让您更好地控制自己正在做的事情.
......你必须每次都包括在内吗?你有没有需要它?
如果您不打算在该模块中使用iostream,则不需要它.在较大的程序中,很少有模块直接执行任何实际IO,因此实际上很少需要使用iostream.
转过来的问题:在python中你需要在大多数非平凡的程序中导入sys和/或os.为什么?
...标准库的相同问题,何时不需要std ::*?
您可以使用使用行,也可以使用std ::前缀.这非常类似于python的选择,你可以说"来自sys import*"或"import sys",然后不得不用"sys."作为前缀.在python中你必须说"sys.stdout"."std :: cout"真的更糟吗?
......是一个功能的"主要"部分?你有没有打电话给主要功能?为什么是整数?为什么C++需要一个main函数但Python不需要?
是的,main是一个功能.通常你不会自己打电话给主.名称"main"保留用于程序的入口点.它返回一个整数,因为返回的值用作程序的状态代码.在Python中,如果要返回非零状态代码,可以使用sys.exit.
Python没有相同的约定,因为使用Python,您可以在不在函数中的模块中使用代码.加载模块时执行此代码.有趣的是,许多人认为将代码放在模块的顶层并且通过执行以下操作来创建主函数是不好的方式:
def main(argv): # program goes here return 0 if __name__ == '__main__': sys.exit(main(sys.argv))
此外,在Python中,您告诉解释器模块在运行时是"主"模块.例如:"python foo.py".在C中,"main"模块(有效地)是具有称为main的函数的模块.(如果有多个带有main函数的模块,那就是链接器错误.)
你需要"std :: cout <<"吗?与Python相比,这不是那么漫长而复杂吗?
Python中的等价物实际上是"sys.stdout.write(...)".Python的print语句是一种特殊情况的简写.
也就是说,许多人确实认为使用IO变换操作符的iostreams惯例是一个坏主意.具有讽刺意味的是,Python似乎受到了这种语法的"启发".如果你想使用print写入stdout以外的地方你可以说:
print >>file, "Hello"
......即使你永远不会使用它,你还需要返回0吗?
你不会使用它,但你的程序会.如前所述,您返回的值是程序的状态代码.
旁白:我确实觉得C++过于复杂,但不是因为你提到的任何一点.一旦你开始编写具有多个模块的非平凡程序并且不仅仅是写入stdout,你提到的所有差异都会消失(在某种意义上,你需要在Python中具有同样多的复杂性).
您
想要将内容输出到控制台时包含.由于打印"Hello world"涉及控制台输出,您需要iostream
.
该main
功能基本上由操作系统调用.它通过传递给程序的命令行参数调用.它返回一个整数,因为程序必须向操作系统返回错误代码(这是确定最后一个命令是否成功的标准方法).
你可以随时使用,printf("hello world");
而不是std::cout << "hello world";
你想要C风格.编写它会更快,并允许您进行格式化输出.
您return 0
来自main
表示程序已成功执行.
编译器不会自动包含所有标准库并使用命名空间,std
因为有时您的代码和库代码之间可能会发生名称冲突,而这些代码和库代码根本不需要.您并不总是需要所有库.同样,有时您使用的是不同的主程序(Windows开发时会想到它自己的,不同的WinMain
启动功能).编译器也不会自动生成,return 0
因为有时程序需要指示它未成功完成.
所有这些都有很好的理由.C++是一种非常广泛的语言,用于从小型嵌入式系统到由100多名程序员构建的巨型应用程序.构建一个小程序的人在桌面上运行的用例绝不是唯一的.所以有时你正在构建库组件.在那种情况下没有main().有时您正在使用没有标准库的小型系统.在那种情况下没有标准.有时你想构建一个与其他Unix文本工具一起工作的Unix工具,并用main()返回的int表示它的完成状态.
换句话说,你抱怨的事情是你的样板.但它们是重要的细节,与该语言的其他用户不同.
这让我想起了程序员的演变.现在展示的一些语言和技术有点陈旧,但你应该得到一般的想法.:)