我们知道,函数、类会改变当前变量的作用域。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中变量的作用域问题的更多相关文章

  1. Python中变量的作用域(variable scope)

    http://www.crifan.com/summary_python_variable_effective_scope/ 解释python中变量的作用域 示例: 1.代码版 #!/usr/bin/ ...

  2. C/C++——C++变量的作用域与生命周期,C语言中变量的作用域和生命周期

    全局变量 作用域:全局作用域(全局变量只需在一个源文件中定义,就可以作用于所有的源文件.) 生命周期:程序运行期一直存在 引用方法:其他文件中要使用必须用extern 关键字声明要引用的全局变量. 内 ...

  3. 注意for循环中变量的作用域-乾颐堂

    1 2 for e in collections:     pass 在for 循环里, 最后一个对象e一直存在在上下文中.就是在循环外面,接下来对e的引用仍然有效. 这里有个问题容易被忽略,如果在循 ...

  4. 注意for循环中变量的作用域

    for e in collections: pass 在for 循环里, 最后一个对象e一直存在在上下文中.就是在循环外面,接下来对e的引用仍然有效. 这里有个问题容易被忽略,如果在循环之前已经有一个 ...

  5. JavaScript 中变量、作用域和内存问题的学习

    这是我学习JavaScript的第二篇文章,之前做过几年的Java开发,发现JavaScript虽然也是面向对象的语言但是确实有很多不同之处.就本篇博客,主要学习总结一下最近学习到的JavaScrip ...

  6. C语言中变量的作用域和生命周期

    变量的类型: 1. 局部变量和全局变量 局部变量也称为内部变量. 局部变量是在函数内作定义说明的.其作用域仅限于函数内, 离开该函数后再 使用这种变量是非法的. 全局变量也称为外部变量,它是在函数外部 ...

  7. Delphi过程和函数中变量的作用域

    变量的作用域是指变量能被某一子程序识别的范围. 全局变量和局部变量.全局变量是指在程序的type区定义的变量,而局部变量是在过程或函数的定义部分声明的变量.全局变量在整个程序中都有意义,局部变量只在它 ...

  8. Python中变量的作用域

    一.变量作用域的含义 变量的作用域说白了就是变量的值从哪里获取,或者说变量取值的地方 我们在写代码过程中会用到很多变量,这些变量会出现在各种代码块中,有的出现在函数块里,有的在函数块外,例如: def ...

  9. C/C++中变量的作用域和存储类型简介

    写在开头 对于很多C/C++的初学者来说,很容易理不清变量的作用域和存储类型这一块的一些概念,也容易将其中的一些概念搞混淆.作为一个C/C++的初学者,笔者希望在这里能够尝试着去理一理这些较为繁杂的概 ...

随机推荐

  1. 20165202 2017-2018-2《Java程序设计》课程总结

    每周作业链接汇总 ++预备作业一:我期待的师生关系++ ++预备作业二:学习基础和C语言基础调查++ ++预备作业三:linux安装及学习++ ++第一周作业:初识JAVA,注册码云并配置Git++ ...

  2. C#调用C++编译的DLL--

    引用 C#调用C++编译的DLL详解 可以单步跟踪进入dll的源码!每种编程语言调用DLL的方法都不尽相同,在此只对用C#调用DLL的方法进行介绍.首先,您需要了解什么是托管,什么是非托管.一般可以认 ...

  3. JVM运行时数据区和垃圾回收机制

    最近参考各种资料,尤其是<深入理解Java虚拟机 JVM高级特性和最佳实践>,大牛之作.把最近学习的Java虚拟机组成和垃圾回收机制总结一下. 你不会的都是新知识,学无止境,每天进步一点点 ...

  4. 【剑指offer15】二进制中1的个数(位运算),C++实现

    原创博文,转载请注明出处! # 本文是牛客网<剑指offer>刷题笔记 1.题目 # 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示.例如,把9表示成二进制是1001,有两 ...

  5. ASP.NET WebForm 与 IE10、IE11

    最近维护公司一个烂项目.NET4.0 Asp.Net WebForm(在MVC5泛滥的今天还有用WebForm的(⊙o⊙)…) IE10.IE11下aspx中大表单提交不上去,报_DoPostBack ...

  6. ios PageControl and UIScrollView

    // //  AlbumViewController.m //  HwangKop08.18 // //  Created by rimi on 15/8/20. //  Copyright (c) ...

  7. vps上搭建jupyter notebook远程服务

    安装anaconda 使用如下命令下载: wget https://repo.continuum.io/archive/Anaconda3-5.0.0.1-Linux-x86_64.sh 如果非roo ...

  8. BZOJ3994:约数个数和(莫比乌斯反演:求[1,N]*[1,M]的矩阵的因子个数)

    Description  设d(x)为x的约数个数,给定N.M,求   Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组数. 接下来的T行,每行两个整数N.M. Outpu ...

  9. CodeForces - 321E:Ciel and Gondolas (四边形不等式优化DP)

    题意:N个人排成一行,分成K组,要求每组的不和谐值之和最小. 思路:开始以为是斜率优化DP,但是每个区间的值其实已经知道了,即是没有和下标有关的未知数了,所以没必要用斜率. 四边形优化. dp[i][ ...

  10. 将美化进行到底,把 PowerShell 做成 oh-my-zsh 的样子

    不知你有没有看过 Linux 上 oh-my-zsh 的样子?看过之后你一定会惊叹,原来命令行还能这么玩!然而 Windows 下能这么玩吗?答案是可行的,接下来就来看看怎么玩. Windows 下我 ...