代码之家  ›  专栏  ›  技术社区  ›  Iceland_jack

为什么C++语法如此复杂?[关闭]

  •  27
  • Iceland_jack  · 技术社区  · 16 年前

    我是一个编程新手,虽然我已经自学了一年的Python,一段时间前我学习了C。

    这个月我在我的大学开始了C++编程课程,我不得不问:“为什么C++代码这么复杂?”

    在Python中写“hello World”就像“打印”Hello World一样简单,但是在C++中,它是:

    # include <iostream>
    using namespace std;
    
    int main ()
    {
        cout << "Hello world.";
        return 0;
    }
    

    我知道这可能是一个很好的理由,但是,为什么……

    • ……每次都必须包含<iostream>?你有过吗 需要吗?
    • …对于标准库,同样的问题,什么时候不需要std::*?
    • …“主要”部分是功能吗?你曾经调用过主函数吗?为什么是整数?为什么C++需要主函数,而Python不需要呢?
    • …是否需要“std::cout<<”?与Python相比,这不是不必要的长和复杂吗?
    • …即使不打算使用它,您也需要返回0吗?

    这可能是因为我正在学习这样的基本C++,但是到目前为止我所做的每一个程序都是这样的,所以我必须一遍又一遍地重写同一个代码。这不是多余的吗?编译器不能只输入这个代码本身,因为它总是相同的(例如,afaik,您总是包括<iostream>、std、int main、返回0)

    10 回复  |  直到 9 年前
        1
  •  76
  •   Robert Harvey    11 年前

    C++是一种更低级的语言,它在没有解释器上下文的情况下执行。因此,它比Python有许多不同的设计选择,因为C++没有依赖于管理类型和内存的信息的环境。C++可以用来编写一个操作系统内核,其中除了程序本身之外,没有机器上运行的代码,这意味着语言(一些库设施不适用于所谓的独立实现)必须是自包含的。这就是为什么C++没有Python的等价物的原因。 eval 也不是确定类成员等的方法,也不是需要执行环境的其他特性(或程序本身的大量开销,而不是这样的环境)

    对于您的个人问题:

    • 你必须包括 <iostream> 每次?你不需要它吗?

    #include <iostream> 是导入 <IoSrand & GT; 进入你的程序。 <IoSrand & GT; 包含标准输入/输出对象-尤其是, cout . 如果您不使用标准I/O对象(例如,您只使用文件I/O,或者您的程序使用GUI库,或者正在编写操作系统内核),则不需要 <IoSrand & GT;

    • 对于标准库,同样的问题,什么时候不需要std::*?

    std 是包含所有标准库的命名空间。 using namespace std; 有点像 from std import * 而A #include 指令(在这方面)更像是一个准骨头。 import std 语句。(实际上,该机制是相当不同的,因为C++没有使用。 使用命名空间std; 自动查找中的对象 性病 ;using指令只将名称导入全局命名空间。)

    这里我会注意到使用指令( using namespace 在C++代码中经常会皱眉,因为它们导入了很多名称,并且可能导致名称冲突。使用声明( using std::cout; )在可能的情况下是首选的,因为它限制了using指令的范围(例如,到一个函数或到一个源文件)。永远不要放 使用命名空间 在没有充分理由的标题中。

    • “主要”部分是功能吗?你曾经调用过主函数吗?为什么是整数?为什么C++需要主函数,而Python不需要呢?

    main 是程序的入口点-执行开始的地方。在Python中 __main__ 模块的作用相同。C++没有像Python那样在定义的函数之外执行代码,所以它的入口点是一个函数而不是一个模块。

    • 是否需要“std::cout<<”?与Python相比,这不是不必要的长和复杂吗?

    std::cout 仅当不导入 咳嗽 通过using指令将名称输入全局命名空间( 使用命名空间std; )或通过使用声明( using std::cout )在这方面,它再次非常类似于Python的 进口性病 从标准导入* from std import cout .

    这个 << 是标准流对象的重载运算符。 cout << value 电话 咳嗽 要输出的函数 value . python不需要这样的额外代码,因为 print 在语言中构建,这对于C++来说是没有意义的,在那里甚至可能没有操作系统,更不用说I/O库了。

    • 即使不打算使用它,您也需要返回0吗?

    不。 主要的 (没有其他功能)具有隐式 return 0; 最后。的返回值 主要的 (或者,如果 exit 函数,传递给它的值)作为退出代码传递回操作系统。0表示程序成功执行-没有遇到错误等。如果遇到错误,应返回一个非零值(或传递给 出口 )

        2
  •  10
  •   Faxwell Mingleton    16 年前

    在帖子末尾回答你的问题时,它可以用C++的哲学来概括:

    你不为你不使用的东西付钱。

    您不必总是使用stdin或stdout(windows/gui应用程序?)你也不会总是使用STL,你所写的每一件东西都不一定会使用标准的main(WiAPI)等。正如前面的海报所说的,C++比Python低。你将接触到更多的细节, 为你提供更多的控制权。

        3
  •  7
  •   xiº Rumpleteaser    9 年前

    …你必须包括 每次?你从来没有 需要吗?

    如果不打算在该模块中使用iostreams,就不需要它。在大型程序中,很少有模块直接执行任何实际的IO,因此很少有模块实际需要使用IO流。

    解决这个问题:在Python中,您需要在大多数非常重要的程序中导入sys和/或os。为什么?

    …标准同样的问题 图书馆,你什么时候不需要std::*?

    您可以使用using行,也可以使用std::前缀。这与python给您的选择非常相似,要么说“from sys import*”,要么说“import sys”,然后必须用“sys”作为前缀。在python中,您必须说“sys.stdout”。“std::cout”真的更糟吗?

    …“主要”部分是功能吗?做 你调用过主函数吗?为什么? 它是整数吗?为什么C++需要 除了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中,当您运行解释器时,告诉它module是“主”模块。例如:“python foo.py”。在C语言中,“main”模块(实际上)是具有一个称为main的函数的模块。(如果有多个模块具有主功能,则为链接器错误。)

    …是否需要“std::cout<<”?不是 不必要的漫长和复杂 与巨蟒相比?

    python中的等价物实际上是“sys.stdout.write(…)”。python的print语句是一个特例,即速记。

    这就是说,很多人确实觉得iostreams为io使用位移操作符的约定是个坏主意。具有讽刺意味的是,python似乎受到了这种语法的“启发”。如果您想使用print写入到stdout以外的其他地方,可以说:

    print >>file, "Hello"
    

    …即使在 你永远不会用它?

    你不会使用它,但你的程序会。如前所述,返回的值是程序的状态代码。

    旁白:我确实觉得C++过于复杂,但不是因为你提到的任何一点。一旦您开始编写具有多个模块且不仅仅是写入stdout的非平凡程序,您所提到的所有差异就消失了(从某种意义上说,您在python中需要的复杂性是一样的)。

        4
  •  6
  •   jgottula    16 年前

    你包括 <iostream> 当你想把东西输出到控制台时。由于打印“hello world”涉及控制台输出,因此需要 iostream .

    这个 main 函数基本上由操作系统调用。它是通过传递给程序的命令行参数来调用的。它返回一个整数,因为程序必须向操作系统返回错误代码(这是确定最后一个命令是否成功的标准方法)。

    你可以一直使用 printf("hello world"); 而不是 std::cout << "hello world"; 如果你想去C风格。写起来要快一点,可以进行格式化输出。

    return 0 主要的 指示程序成功执行。

    编译器不会自动包含所有标准库并使用命名空间 std 因为有时名称冲突会在代码和库代码之间产生,而实际上您可能根本不需要这些代码。你并不总是需要所有的图书馆。同样,有时您使用的是不同的主例程(Windows开发会想到它自己的、不同的 WinMain 启动功能)。编译器也不会自动 返回0 因为有时程序需要指出它完成失败。

        5
  •  6
  •   Bill Forster    16 年前

    所有这些事情都有充分的理由。C++是一种非常广泛的语言,它用于从小型嵌入式系统到由100s程序员构建的巨型应用程序。一个人在桌面上运行一个小程序的用例决不是唯一的。因此,有时您正在构建库组件。在这种情况下,没有main()。有时,您在一个没有标准库的小型系统上工作。在这种情况下,没有标准。有时您希望构建一个与其他Unix文本工具一起工作的Unix工具,并用从main()返回的int来表示其完成状态。

    换句话说,你抱怨的事情就是你的样板。但这些细节对语言的其他用户来说是至关重要的。

        6
  •  5
  •   Greg Hewgill    16 年前

    这让我想起 The Evolution of a Programmer . 现在演示的一些语言和技术有点过时,但您应该了解一般的概念。:)

        7
  •  5
  •   MSalters    16 年前

    C++之所以相当复杂的原因之一,是因为它是为了解决大型程序中出现的问题而设计的。在C++被创建为AT&AMT时,他们最大的C程序是大约1000万行代码。在这个尺度上,C的功能不是很好。C++解决了这类程序中的许多问题。

    有了这一点,也可以回答最初的问题:

    • 你会的 include <iostream> 在需要的地方。如果您有10个C++文件,很常见的是少于1000个,有时少于100个将产生用户可见输出。
    • 像这样的陈述 print "Hello, world" 假设有一个默认输出,但是很难进行归纳。这个 cout << "Hello, world" 窗体使其明确输出的位置,但同一窗体还允许 cerr << "Goodbye, world" MyTmpFile << "Starting phase #" << i
    • 标准库在 std:: 命名空间。我的10000个文件将在另外的25个名称空间中。
    • main 在很多方面都很奇怪,因为它是启动函数。
        8
  •  3
  •   isekaijin    16 年前

    Baldur:

    你并不总是需要 <iostream> . 你唯一需要的就是:

    1. main 功能(或 WinMain ,如果您正在编写win32应用程序)。
    2. 变量、函数、运算符、语言结构( if ,请 while 等)。
    3. 能够将库中的功能包含到程序中。

    其他一切都是特定于应用程序的。

    正如其他海报上说的那样, 主要的 函数是错误代码 . 如果 主要的 返回0,高兴点:一切正常!

    这在编写与其他程序“通信”的程序时很有用。程序能够“告诉”另一个程序是否正确执行的最简单的方法是使用错误代码。

        9
  •  2
  •   Stephen Veiss    16 年前

    正如人们所说,简单的答案是他们是不同的语言,有不同的目标。回答你的具体问题…

    …你必须包括 <iostream> 每次?你不需要它吗?

    <IoSrand & GT; 是IoSokes的头文件之一,是负责输入/输出的C++标准库的一部分;在这种情况下,您需要它来访问 std::cout . 如果您不在源文件中执行I/O操作,则不需要包括它——例如,大多数包含类定义的文件可能不需要 <IoSrand & GT; .

    …对于标准库,同样的问题,什么时候不需要std::*?

    std 是标准库中包含类的命名空间的名称;它的存在是为了避免名称冲突。python有包和模块来实现这一点。

    你可以使用 using 语句将来自另一个命名空间的项引入当前范围,请参见 this FAQ entry 举个例子(解释一下为什么盲目地 性病 进入范围!.

    …为什么“主要”部分是一个函数?你曾经调用过主函数吗?为什么是整数?为什么C++需要主函数,而Python不需要呢?

    C++中的可执行语句必须包含在函数中,并且 main 函数定义为执行开始的位置。在Python中,可执行语句可以放在文件的顶层,并定义执行。

    你可以打电话 main() 如果你愿意的话——毕竟这只是一个函数——但通常没有理由这样做。幕后,大多数C++调用的实现 主体() 一旦运行库完成了一些启动内务管理工作。

    的返回值 主体() 返回到操作系统。这源于C和Unix,其中应用程序需要提供一个1字节的退出状态代码,并从返回该值 主体() 是一种明确的表达方式。

    …为什么需要“std::cout<<”?与Python相比,这不是不必要的长和复杂吗?

    这只是设计上的不同。iostreams是一个相当复杂的野兽,有很多特性,其中的一个副作用是语法有时对于简单的任务来说有点难看。

    …为什么你需要返回0,即使你永远不会使用它?

    您确实使用它;这是作为程序退出状态返回到操作系统的值。

        10
  •  0
  •   Aziz    16 年前

    蟒蛇 高级 语言。C++是 中层 语言。