语句作用域的一个小问题!

时间:2022-11-03 17:36:53
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> ivec;
int ival;
cout << "Enter numbers(Ctrl+Z to end):" << endl;
while (cin >> ival)
ivec.push_back(ival);
if (ivec.size() == 0)
{
cout << "No element?!" << endl;
return -1;
}
cout << "Sum of each pair of counterpart elements in the vector:"
<< endl;
vector<int>::size_type cnt = 0;
for (vector<int>::iterator first = ivec.begin(),
 last = ivec.end() -1;first < last;++first,--last)
{
cout << *first + *last << "\t";
++cnt;
if (cnt%6 == 0)
cout << endl;
}
if (first == last)
cout << endl
         << "The center element is no been summed "
 << "and its value is "
 << *first << endl;
return 0;
}
这是C++ Primer第四版里的一个习题源代码(是书里的原答案),按书里讲first,last的作用域都是语句作用域,出了for循环就被释放内存了,VC++2010也确实报错。但是我在C++ Primer Plus第五版里看到的确是刚好相反,说for后面括号里定义的变量是全局变量。不知道谁对谁错,请高人指点!

7 个解决方案

#1


但是我在C++ Primer Plus第五版里看到的确是刚好相反,说for后面括号里定义的变量是全局变量


====
你看错了吧....

肯定看错了.

#2


很早的时候,在 for 的 () 定义的变量在 for 后面是可见的。
后来这个规则修改了,这就是 for 的一致性。
在VC60 向高版本转换的时候,需要修改这个一致性,以兼容旧的项目。

而 for 的 {} 里面的变量在 for 后面是肯定不可见的。
这是 C++ 的 块作用域。

#3


有关for中变量作用域,各个编译器的实现是不一样的
简单的例子

#include <stdio.h>
int main()
{
  for(int i=1;i<10;i++)
    ;
  printf("%d\n",i);  
}

这段程序在VC下可以编译通过,但对gcc或cb是不可编译的
g++的错误为
t.cpp: In function ‘int main()’:
t.cpp:6:17: error: name lookup of ‘i’ changed for ISO ‘for’ scoping
t.cpp:6:17: note: (if you use ‘-fpermissive’ G++ will accept your code)
也就是说ISO标准是for(...)中定义变量的作用域只在for中
所以,这种与编译器有关的问题没有对错,只能由用的编译器来决定是否能通过
最好是不用这种方式,以提高程序可移植性

#4


引用 3 楼 keiy 的回复:
有关for中变量作用域,各个编译器的实现是不一样的
简单的例子
C/C++ code

#include <stdio.h>
int main()
{
  for(int i=1;i<10;i++)
    ;
  printf("%d\n",i);  
}


这段程序在VC下可以编译通过,但对gcc或cb是不可编译的
g++的错误为
t.cpp: In function ‘int……

在大括号里面定义和在小括号里面定义是不一样的,大括号里面貌似哪里都是行不通的,小括号里面定义有的编译器有了这个限制,比如在linux下页不恩年该编译通过,但不是作用域问题

#5


引用楼主 qsq_007 的回复:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> ivec;
int ival;
cout << "Enter numbers(Ctrl+Z to end):" << endl;
while (cin >> ival)
ivec.push_back(ival);
……

烦请楼主指出第几页吧

#6


引用 5 楼 it_leaf 的回复:
引用楼主 qsq_007 的回复:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> ivec;
int ival;
cout << "Enter numbers(Ctrl+Z to end):" << endl;
while (cin >> ival)
ive……

不好意思,我看的是C++ Primer第四版2006版本的扫描pdf,我回去看了下才买的实体书,发现已经改过来了!

#7


VC6不报错

#1


但是我在C++ Primer Plus第五版里看到的确是刚好相反,说for后面括号里定义的变量是全局变量


====
你看错了吧....

肯定看错了.

#2


很早的时候,在 for 的 () 定义的变量在 for 后面是可见的。
后来这个规则修改了,这就是 for 的一致性。
在VC60 向高版本转换的时候,需要修改这个一致性,以兼容旧的项目。

而 for 的 {} 里面的变量在 for 后面是肯定不可见的。
这是 C++ 的 块作用域。

#3


有关for中变量作用域,各个编译器的实现是不一样的
简单的例子

#include <stdio.h>
int main()
{
  for(int i=1;i<10;i++)
    ;
  printf("%d\n",i);  
}

这段程序在VC下可以编译通过,但对gcc或cb是不可编译的
g++的错误为
t.cpp: In function ‘int main()’:
t.cpp:6:17: error: name lookup of ‘i’ changed for ISO ‘for’ scoping
t.cpp:6:17: note: (if you use ‘-fpermissive’ G++ will accept your code)
也就是说ISO标准是for(...)中定义变量的作用域只在for中
所以,这种与编译器有关的问题没有对错,只能由用的编译器来决定是否能通过
最好是不用这种方式,以提高程序可移植性

#4


引用 3 楼 keiy 的回复:
有关for中变量作用域,各个编译器的实现是不一样的
简单的例子
C/C++ code

#include <stdio.h>
int main()
{
  for(int i=1;i<10;i++)
    ;
  printf("%d\n",i);  
}


这段程序在VC下可以编译通过,但对gcc或cb是不可编译的
g++的错误为
t.cpp: In function ‘int……

在大括号里面定义和在小括号里面定义是不一样的,大括号里面貌似哪里都是行不通的,小括号里面定义有的编译器有了这个限制,比如在linux下页不恩年该编译通过,但不是作用域问题

#5


引用楼主 qsq_007 的回复:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> ivec;
int ival;
cout << "Enter numbers(Ctrl+Z to end):" << endl;
while (cin >> ival)
ivec.push_back(ival);
……

烦请楼主指出第几页吧

#6


引用 5 楼 it_leaf 的回复:
引用楼主 qsq_007 的回复:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> ivec;
int ival;
cout << "Enter numbers(Ctrl+Z to end):" << endl;
while (cin >> ival)
ive……

不好意思,我看的是C++ Primer第四版2006版本的扫描pdf,我回去看了下才买的实体书,发现已经改过来了!

#7


VC6不报错