if、while中变量的作用域问题
我们知道,函数、类会改变当前变量的作用域。if,while等分支循环结构会继承外部作用域,即外部变量对分支循环结构内部可见。
但是C语言不支持if,while等分支循环结构内部作用域对外可见,而PHP则不然。
在PHP中,if,while等分支循环结构中声明的局部变量,在分支循环结构后面仍然有效。
比如,函数中声明的变量在函数外面是不可见的
C语言:01 #include<stdio.h>
02
03 int foo()
04 {
05 int bar;
06 bar = 3;
07 }
08
09 int main()
10 {
11 printf("%d\n",bar);
12 return 0;
13 }
报错:
scope.c: In function ‘main’:
scope.c:11: 错误:‘bar’ 未声明 (在此函数内第一次使用)
scope.c:11: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其
scope.c:11: 错误:所在的函数内只报告一次。)
PHP语言:1 <?php
2 function foo()
3 {
4 $bar = 1;
5 }
6
7 echo $bar;
报错:
Notice: Undefined variable: bar in scope.php on line 7
PHP Notice: Undefined variable: bar in scope.php on line 7
而if,while等循环分支结构会继承外部作用域,即外部变量对循环分支结构内部可见
类似的:
C语言:01 #include<stdio.h>
02
03 int main()
04 {
05 int foo = 1;
06 if(1)
07 {
08 int bar = foo;
09 printf("%d\n",bar);
10 }
11
12 while(1)
13 {
14 int bar = foo;
15 printf("%d\n",bar);
16 break;
17 }
18
19 return 0;
20 }
输出:
1
1
PHP语言:01 <?php
02 $foo = 1;
03 if(1)
04 {
05 $bar = $foo;
06 echo $bar,"\n";
07 }
08
09 while(1)
10 {
11 $bar = $foo;
12 echo $bar,"\n";
13 break;
14 }
输出:
1
1
但是不一样的地方来了。
C语言:01 #include<stdio.h>
02
03 int main()
04 {
05 int foo = 1;
06 if(1)
07 {
08 int bar = foo;
09 printf("%d\n",bar);
10 }
11
12 printf("%d\n",bar);
13
14 while(1)
15 {
16 int bar = foo;
17 printf("%d\n",bar);
18 break;
19 }
20
21 printf("%d\n",bar);
22
23 return 0;
24 }
报错:
scope.c: In function ‘main’:
scope.c:12: 错误:‘bar’ 未声明 (在此函数内第一次使用)
scope.c:12: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其
scope.c:12: 错误:所在的函数内只报告一次。)
PHP语言
01 <?php
02 $foo = 1;
03 if(1)
04 {
05 $bar = $foo;
06 echo $bar++,"\n";
07 }
08
09 echo $bar,"\n";
10
11 while(1)
12 {
13 $bar2 = $foo;
14 echo $bar2++,"\n";
15 break;
16 }
17
18 echo $bar2,"\n";
输出:
1
2
1
2
这就是需要注意的地方!
if、while中变量的作用域问题的更多相关文章
- Python中变量的作用域(variable scope)
http://www.crifan.com/summary_python_variable_effective_scope/ 解释python中变量的作用域 示例: 1.代码版 #!/usr/bin/ ...
- C/C++——C++变量的作用域与生命周期,C语言中变量的作用域和生命周期
全局变量 作用域:全局作用域(全局变量只需在一个源文件中定义,就可以作用于所有的源文件.) 生命周期:程序运行期一直存在 引用方法:其他文件中要使用必须用extern 关键字声明要引用的全局变量. 内 ...
- 注意for循环中变量的作用域-乾颐堂
1 2 for e in collections: pass 在for 循环里, 最后一个对象e一直存在在上下文中.就是在循环外面,接下来对e的引用仍然有效. 这里有个问题容易被忽略,如果在循 ...
- 注意for循环中变量的作用域
for e in collections: pass 在for 循环里, 最后一个对象e一直存在在上下文中.就是在循环外面,接下来对e的引用仍然有效. 这里有个问题容易被忽略,如果在循环之前已经有一个 ...
- JavaScript 中变量、作用域和内存问题的学习
这是我学习JavaScript的第二篇文章,之前做过几年的Java开发,发现JavaScript虽然也是面向对象的语言但是确实有很多不同之处.就本篇博客,主要学习总结一下最近学习到的JavaScrip ...
- C语言中变量的作用域和生命周期
变量的类型: 1. 局部变量和全局变量 局部变量也称为内部变量. 局部变量是在函数内作定义说明的.其作用域仅限于函数内, 离开该函数后再 使用这种变量是非法的. 全局变量也称为外部变量,它是在函数外部 ...
- Delphi过程和函数中变量的作用域
变量的作用域是指变量能被某一子程序识别的范围. 全局变量和局部变量.全局变量是指在程序的type区定义的变量,而局部变量是在过程或函数的定义部分声明的变量.全局变量在整个程序中都有意义,局部变量只在它 ...
- Python中变量的作用域
一.变量作用域的含义 变量的作用域说白了就是变量的值从哪里获取,或者说变量取值的地方 我们在写代码过程中会用到很多变量,这些变量会出现在各种代码块中,有的出现在函数块里,有的在函数块外,例如: def ...
- C/C++中变量的作用域和存储类型简介
写在开头 对于很多C/C++的初学者来说,很容易理不清变量的作用域和存储类型这一块的一些概念,也容易将其中的一些概念搞混淆.作为一个C/C++的初学者,笔者希望在这里能够尝试着去理一理这些较为繁杂的概 ...
随机推荐
- C# Http方式下载文件到本地类
直接上代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using S ...
- New Concept English Two 34 game over
$课文95 纯属虚构 1049. When the Ambassador or Escalopia returned home for lunch, his wife got a shock. 当艾 ...
- yii2.0 使用不同语言
1.建立语言目录.文件.项目根目录建立messages文件夹.存放不同语言对应的目录文件. 例如中文和英文 message 下建立两个文件夹 en.zh_CN 里面可以对应着多个翻译文件 2.在mai ...
- ansible资料
ansible系列教程-强烈推荐看完 ansible官方编写的例子 ansible_ui Jenkins配置ansible galaxy 官方文档 中文教程1 中文教程2 playbook进阶 YAM ...
- azure最佳实践系列1-自我修复的设计
如何设计你的应用,能够在系统错误时做到自我修复?在分布式系统中,会经常遇到错误.硬件也会遇到异常情况.网络有时会出现短暂的错误.整个地区出现了服务中断.即便如此,关于这些问题的方案也是要提前规划的.因 ...
- Jenkins自动构建VS的代码20150607
1. 安装Jenkins Ø 双击安装即可,如果需要,可以配置环境变量(一般没设置) Ø 在浏览器中输入:http://localhost:8080/打开jekins,及完成jenkins安装 Ø 如 ...
- C# OPC UA服务器 OPC UA网关 三菱 西门子 欧姆龙 Modbus转OPC UA 服务器 可配置的OPC UA服务器网关 HslSharp软件文档
前言 本文将使用一个基于开源项目HslCommunication创建的OPC UA网关,方便通过配置创建一个OPC UA的网关中心.具体的操作及支持的设备信息项目参照下面: 开源项目HslCommun ...
- JavaScript class 使用
/********************************************************************* * JavaScript class 使用 * 说明: * ...
- MarkDown初学
什么是MarkDown? 第一次用这个MarkDown,感觉很好,界面友好,使用简洁而又使用,最主要的是此园支持这个语法,欣慰欣慰!先这么多,看看效果如何 推荐个不错的学习网站 Markdown 语法 ...
- vue-route(三)后台管理路由配置
在一个后台管理的项目中,关于路由的配置, 我们需要实现的一个布局是header,aside,main三部分,后期还可能添加footer部分,实现的需求是请求数据时,局部的刷新,这个时候我们就需 ...