【问题标题】:C++ std::cin won't work out of main() [duplicate]C++ std::cin 无法使用 main() [重复]
【发布时间】:2016-11-25 01:41:24
【问题描述】:

在第一个代码块中,编译器没有给出错误。另一方面,第二个代码块给出了错误error: 'cin' in namespace 'std' does not name a type

第一段代码:

#include <iostream>

int y;

int main(){
std::cout << "Enter something! \n";
std::cin >> y;
}

第二段代码:

 #include <iostream>

 int y;

 int main(){
 std::cout << "Enter something! \n";

 }

 std::cin >> y;

是什么导致了这种行为?我可以修复它吗?

如果您需要更多详细信息,请随时在 cmets 中询问。

【问题讨论】:

  • 导致这种行为的原因是它不是有效的 C++ 代码。
  • 您只能在函数内运行代码。在函数之外,您所能做的就是声明变量并创建类型。所以std::cin &gt;&gt; y; 在第二个代码块中是非法的 - 编译器的错误说它希望你声明一个变量并且 std::cin 不是一个类型(这是真的 - 它不是)
  • @SamVarshavchik 是的,但我想知道为什么它是无效的 C++ 代码。
  • @BoeNoe 几乎所有关于某事是否有效的“为什么”问题的答案都是“因为标准是这样说的”。您想要标准中相关段落的链接吗?
  • @BoeNoe 我觉得两句话不是一个好的答案,所以我把它写成了评论。答案将更深入地解释什么是有效的,什么是无效的,并且可能有例子来支持它。

标签: c++ cin


【解决方案1】:

按照 C++ 的工作方式,您不能在函数之外拥有可执行代码。当第一个块编译时,编译器会像这样查看程序:

  1. 好的,该开始这个程序了!让我们看看main()
  2. 好的,打印"Enter something! \n"
  3. 现在等待用户输入并将其存储在y
  4. 好的,main() 已经完成了,没有其他功能了……猜猜程序结束了!
  5. main() 之外没有什么可担心的,所以我已经完成了。

第二个块的问题是编译器只进入第 2 步。然后它会认为是这样的:

  1. 好了,main() 完成了
  2. main()之外还有什么要注意的?
  3. 哦,这看起来像是一个新的类型声明。但事实并非如此。
  4. 抛出错误!

如果您正在上课或自学 C++,您将在稍后的学习中遇到结构和类,这些会让这更有意义。它们是编译器试图将其解释为的那种语法示例。

【讨论】:

  • 赞成很好的解释!
  • 即使有main以外的其他函数,当main结束时,程序也会终止。 4) 错了。
  • @alain 很公平,我知道它是这样工作的。我也知道编译器不会说随意的英语。也许更正确的版本是“4)没有其他函数调用,5)main() 已经结束,所以终止”。但我想我明白了。
  • ..哦,我认为您指的是编译,但是 3) 有点误导,因为等待的不是编译器。只需满足于编译或运行时 ;-)
  • 是的,也是公平的。我汇总了编译和运行时,因为 OP 存在编译器问题。我知道这有点误导,但为了向初学者解释,我觉得稍微掩盖真相可能是值得的。如果 OP 真的想知道幕后发生的事情,我相信他们可以找到。
【解决方案2】:

你在 C \C++ 的基本语法上失败了。

std::cin &gt;&gt; y; 是一个声明。函数体之外不允许声明,只有声明是。编译器尝试将该行视为声明,并且声明中的第一个标记是类型说明符。因此,您确实会收到该错误消息。

【讨论】:

    猜你喜欢
    • 2018-07-18
    • 2015-11-17
    • 2018-10-26
    • 2011-07-09
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多