我可以在c ++中的函数体之外进行操作吗?

时间:2018-10-31 22:28:27

标签: c++

#include <stdio.h>
#include <iostream>
using namespace std;
int val = 100;
//cout<<val<<endl;    //this is not valid.
int main(){
int val=100;  //why this is valid?
return 0;
}

我在上面的代码中发现了这两件事:

  • cout<<val<<endl;在主体功能外部无效。为什么会这样?
  • 我认为两个val都在namespace std中定义。但是它们为什么都有效呢?

2 个答案:

答案 0 :(得分:2)

您可以通过函数调用来初始化事物,所以您可以这样说:

   ostream & os = cout<< 42 <<endl;

但是它的用途并不明显,您可能会遇到像cout这样的对象的实例化顺序问题。

您不能做的是编写如下代码:

  x = x + 1;
  for ( int y = 0; y < 10; y++ ) {}

函数之外-语言的定义方式。

在您的代码中,val都不在std名称空间中,尝试将它们放置在命名空间中是非法的。您需要阅读示波器。

答案 1 :(得分:2)

  

cout<<val<<endl;在主体功能之外无效。为什么会这样?

因为该标准规定表达式语句只能在块范围内。

  

我可以在c ++中的函数体之外进行操作吗?

函数外不能有表达式语句。

但是,声明语句可以具有诸如cout<<val<<endl(注意缺少分号)之类的副作用的子表达式,在这种情况下,这些表达式将在初始化所声明的内容时执行。尼尔·巴特沃思(Neil Butterworth)在回答中展示了一个例子。

  
      
  1. 我认为两个val都在命名空间std中定义
  2.   

您认为错了。在std命名空间中均未声明。

在全局名称空间中声明了一个val,而在函数范围中声明了另一个。在另一个同名变量的潜在作用域中的嵌套作用域中声明一个变量称为阴影,即在命名空间作用域的块作用域阴影val中的val

void main()

这也是无效的。 main必须返回int