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
这就是需要注意的地方!
最新文章
- Provider:SSL Provider,error:0-等待的操作过时
- 黄聪:wordpress/wp-includes目录文件
- javascript数学计算
- C语言基础--结构体对齐,位域,联合体
- .NET分布式事务处理总结【下】 - 包含MSMQ的分布式事务处理
- ajax get/post
- ztree树形插件
- 十分钟搞懂什么是CGI(转)
- OCP-1Z0-051-名称解析-文章12称号
- c语言的预处理指令分3种 1>; 宏定义 2>; 条件编译 3>; 文件包含
- kali下安装截图软件
- Markdown使用小总结[不定时更新]
- python基础一 ------如何获取多个字典相同的键
- angularjs学习第四天笔记(第一篇:简单的表单验证)
- ingress rewrite
- STL_map.修改删除
- HDU 4738 Caocao&#39;s Bridges (2013杭州网络赛1001题,连通图,求桥)
- TCP处理主要开销
- java invoke(转摘)
- 20145216《java程序设计》课程总结