C++中关于作用域的错误总结

在C/C++中一般全局变量的值可能被程序中局部变量的值覆盖,这是为什么?

原因:因为全局变量的赋值是发生在编译时刻,而程序中局部变量的赋值发生在执行时刻,所以后者覆盖前者。

有时候局部作用域或着是局部变量搞不清楚容易造成错误,如下面例子:

#include <iostream>
#include <vector>
#include <string>

using namespace std;
int x=3;
int main(int argc, const char * argv[])
{
    if (1) {
        int x =2;
    }
    cout<<"x="<<x<<endl;
    return 0;
}

这里的结果竟然是x=3;

#include <iostream>
#include <vector>
#include <string>

using namespace std;
int x=3;
int main(int argc, const char * argv[])
{
    if (1) {
        x =2;
    }
    cout<<"x="<<x<<endl;
    return 0;
}

这个结果是x=2;

第一个例子明显是定义了一个局部变量,然而if语句算是一个作用域,局部变量只作用在自己的作用域内,出了作用域,显然是全局变量在起作用;第二个一直是全局变量在起作用。

时间: 2024-10-19 03:31:28

C++中关于作用域的错误总结的相关文章

浅谈javascript中的作用域

所谓的作用域,可以简单理解为一个可以读.写的范围(区域),有些js经验的同学可能会说:"js没有块级作用域",js除了全局作用域外,只有函数可以创建作用域.作用域的一个好处就是可以隔离变量. 我们通过一些例子来帮助我们理解js中的作用域. 1 alert(a); 2 var a = 1; 如果对作用域一点不了解的同学可能会说 alert的是1或者报错:但实际上是undefined: 说到这里,我们首先说一下js逐行解析代码之前做的一些准备工作, js在逐行读代码之前,会做一些“预解析”

【翻译】JavaScript中的作用域和声明提前

原文:http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html ===翻译开始=== 你知道下面的JavaScript脚本执行结果是什么吗? 1 var foo=1; 2 function bar(){ 3 if(!foo){ 4 var foo=10; 5 } 6 alert(foo); 7 } 8 bar(); 如果你对弹出的结果是"10"感到惊讶的话,那么下面这段脚本会让你晕头转向的: 1 var a=1

编程中遇到的Python错误和解决方法汇总整理

这篇文章主要介绍了自己编程中遇到的Python错误和解决方法汇总整理,本文收集整理了较多的案例,需要的朋友可以参考下 开个贴,用于记录平时经常碰到的Python的错误同时对导致错误的原因进行分析,并持续更新,方便以后查询,学习.知识在于积累嘛!微笑+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++错误: 复制代码代码如下: >>> def f(x, y):      print x, y  >>> t

JavaScript中的作用域链和闭包

JavaScript中的作用域链和闭包 2012-06-29 11:41 1878人阅读 评论(46) 收藏 举报 JavaScript中出现了一个以前没学过的概念——闭包.何为闭包?从表面理解即封闭的包,与作用域有关.所以,说闭包以前先说说作用域. 作用域(scope) 通常来说一段程序代码中使用的变量和函数并不总是可用的,限定其可用性的范围即作用域,作用域的使用提高了程序逻辑的局部性,增强程序的可靠性,减少名字冲突. 全局作用域(Global Scope) 在代码中任何地方都能访问到的对象拥

聊一下JS中的作用域scope和闭包closure

scope和closure是javascript中两个非常关键的概念,前者JS用多了还比较好理解,closure就不一样了.我就被这个概念困扰了很久,无论看别人如何解释,就是不通.不过理越辩越明,代码写的多了,小程序测试的多了,再回过头看看别人写的帖子,也就渐渐明白了闭包的含义了.咱不是啥大牛,所以不搞的那么专业了,唯一的想法就是试图让你明白什么是作用域,什么是闭包.如果看了这个帖子你还不明白,那么多写个把月代码回过头再看,相信你一定会有收获:如果看这个帖子让你收获到了一些东西,告诉我,还是非常

javascript中函数作用域之”提升“

javascript中函数作用域之变量提升 当我们在函数内部用关键字var声明一个变量的时候,此变量的作用域限制在当前函数. 提升:在一个作用域内部,不管一个变量用var声明的位置在哪里,这个变量属于当前整个作用域,并且在当前作用域的任何位置都可以访问它.在javascript中,这种行为/现象称之为"提升",即一个变量在一个作用域的任何位置用var声明,javascript引擎都会把这些用var声明的变量"移动"到当前作用域的开始处. 谈到javascript这种

Oracle中字符缓冲区相关错误

一.buffer overflow,limit of 10000 bytesdeclarebeginfor c in 1..1000 loop dbms_output.put_line('测试测试测试');end loop;end;缓冲区默认大小为10000 bytes.循环1000次就一共有6000个汉字,也就是12000 bytes.在SQL窗口的输出标签页中设置缓冲区大小. 二.数字或值错误:字符串缓冲区太小declarev varchar2(100):='';beginfor c in

JBPM在Eclipse中运行时页面错误ProcessEngine cannot be resolved to a type

JBPM在Eclipse中运行时页面错误ProcessEngine cannot be resolved to a type 从网上找了一些杂七杂八的回答,比如在Java EE Module Dependencies设置中添加依赖的jar 但是这个设置是以前旧版本的Eclipse所有的.新版的已经没有这个设置. 归根结底是因为我自己创建了一个UserLibrary.引入了jbpm依赖的所有jar 结果无法发布到tomcat中. 干脆把这个引用删掉,直接复制所有jar到项目的lib文件夹下. 一切

Socket程序中的Error#10054错误

近期使用winSock做的一个网络项目中,使用TCP+Socket连接编写的一个多线程的网络程序,功能是client负责不断地向server端发送数据,服务端负责接收数据.client是一个DLL,服务端程序是一个随机启动的NT Service服务程序. 程序在夜间无人操作的执行过程中,client常常不定时地出现错误号为:10054的错误,而server端并没有对应的提示.执行环境是win2000+sp4,这个问题出现得比較莫名其妙. 查了MSDN上的10054错误号说明:WSAECONNRE