GVKun编程网logo

while(1)vs. while(True)—为什么会有区别(在python 2字节码中)?(python中while和while true的区别)

34

本文将分享while的详细内容,并且还将对1vs.while进行详尽解释,此外,我们还将为大家带来关于C++while(do-while)循环详解、for(;;)和while(true)没有区别、fo

本文将分享while的详细内容,并且还将对1vs. while进行详尽解释,此外,我们还将为大家带来关于C++ while(do-while)循环详解、for (; ; )和while (true) 没有区别、for/while(do while)、Gmail中while(1)的作用是什么?的相关知识,希望对你有所帮助。

本文目录一览:

while(1)vs. while(True)—为什么会有区别(在python 2字节码中)?(python中while和while true的区别)

while(1)vs. while(True)—为什么会有区别(在python 2字节码中)?(python中while和while true的区别)

这个问题引起了有关perl中无限循环的问题:while(1)Vs。for(;;)是否存在速度差异?,我决定在python中运行类似的比较。我希望编译器会为while(True):pass和生成相同的字节码while(1): pass,但是python2.7实际上不是这种情况。

以下脚本:

import disdef while_one():    while 1:        passdef while_true():    while True:        passprint("while 1")print("----------------------------")dis.dis(while_one)print("while True")print("----------------------------")dis.dis(while_true)

产生以下结果:

while 1----------------------------  4           0 SETUP_LOOP               3 (to 6)  5     >>    3 JUMP_ABSOLUTE            3        >>    6 LOAD_CONST               0 (None)              9 RETURN_VALUE        while True----------------------------  8           0 SETUP_LOOP              12 (to 15)        >>    3 LOAD_GLOBAL              0 (True)              6 JUMP_IF_FALSE            4 (to 13)              9 POP_TOP  9          10 JUMP_ABSOLUTE            3        >>   13 POP_TOP                          14 POP_BLOCK                   >>   15 LOAD_CONST               0 (None)             18 RETURN_VALUE

使用while True明显更复杂。为什么是这样?

在其他情况下,python的行为就好像True等于1:

>>> True == 1True>>> True + True2

为什么要while区分两者?

我注意到python3确实使用相同的操作评估语句:

while 1----------------------------  4           0 SETUP_LOOP               3 (to 6)  5     >>    3 JUMP_ABSOLUTE            3         >>    6 LOAD_CONST               0 (None)               9 RETURN_VALUE         while True----------------------------  8           0 SETUP_LOOP               3 (to 6)  9     >>    3 JUMP_ABSOLUTE            3         >>    6 LOAD_CONST               0 (None)               9 RETURN_VALUE

python3中的布尔值评估方式是否有变化?

答案1

小编典典

在Python
2.x中,True它不是关键字,而只是在类型中定义为1的内置全局常量bool。因此,解释器仍然必须加载的内容True。换句话说,True是可重新分配的:

Python 2.7 (r27:82508, Jul  3 2010, 21:12:11) [GCC 4.0.1 (Apple Inc. build 5493)] on darwinType "help", "copyright", "credits" or "license" for more information.>>> True = 4>>> True4

在Python
3.x中,它确实成为关键字和实常数:

Python 3.1.2 (r312:79147, Jul 19 2010, 21:03:37) [GCC 4.2.1 (Apple Inc. build 5664)] on darwinType "help", "copyright", "credits" or "license" for more information.>>> True = 4  File "<stdin>", line 1SyntaxError: assignment to keyword

因此,解释器可以将while True:循环替换为无限循环。

C++ while(do-while)循环详解

C++ while(do-while)循环详解

while 循环有两个重要组成部分:
  1. 进行 true 值或 false 值判断的表达式;
  2. 只要表达式为 true 就重复执行的语句或块;

图 1 显示了 while 循环的一般格式,右侧流程图直观地描绘了其工作原理。

while 循环的语句结构及流程图
图 1 while 循环的语句结构及流程图

现在来看一看 while 循环的每个部分。第一行,有时称为循环头,由关键字 while 组成,后跟待测试的条件,括在括号中。条件由任何可被判断为 true 或 false 的表达式表示。接下来是循环体,它包含一个或多个 C++ 语句。

循环的工作原理是,首先判断条件表达式的值,如果它是真的,则循环体中的每个语句都被执行;然后,再次测试条件,如果条件表达式仍然为 true,则循环体中的每个语句将再次被执行。如此循环往复,直到条件表达式被判断为 false。

请注意,与 if 语句一样,在有条件执行的主体中的每个语句都以分号结尾,但在括号中的条件表达式后面没有分号,这是因为 while 循环不完整,后面没有跟随的语句。而且,与 if 语句一样,当循环体包含两个或多个语句时,这些语句必须用大括号括起来。当循环的主体只包含一个语句时,可以省略括号。

基本上,while 循环就像是一个可以执行一遍又一遍的 if 语句。只要括号中的表达式为 true,则有条件执行的语句将不断重复。

下面的程序使用了 while 循环打印“Hello”字符串 5 次。
#include <iostream>
using namespace std;

int main()
{
    int count = 1;
    while (count<= 5)
    {
        cout << "Hello ";
        count = count + 1;
    }
    cout << "\nThat's all!\n";
    return 0;
}
程序输出结果:

Hello Hello Hello Hello Hello
That's all!

分析这个程序。在第 6 行中,整数变量 count 被定义并用值 1 初始化。在第 7 行中,while 循环以下面的语句开头:

while (count<= 5)

该语句测试变量 count 以确定其值是否小于或等于 5。因为它确实小于 5,所以循环体(第 9 行和第 10 行)中的语句被执行:

cout << "Hello   ";
count = count + 1;

第 9 行中的语句将显示字符串“Hello”。第 10 行中的语句则给变量 count 加上 1,使其值变成了 2。这是循环体中的最后一个语句,因此在执行之后循环又一次开始。它再次测试表达式“count<=5”,并且由于仍然为 true,循环体中的语句将再次执行,该循环不断重复,直到变量 count 等于 6,使表达式“count<=5”为 false,然后退出循环,如图 2 所示。

while循环工作原理
图 2 while 循环工作原理

循环的每一次执行称为迭代。以上示例中的循环将执行 5 次迭代,直至表达式“count<=5”被测试并且发现为 false,导致循环终止,然后程序继续执行该循环之后的语句。控制循环迭代次数的变量称为循环控制变量,在上面的例子中,count 就是循环控制变量。

while 是一个预测试循环

while 循环是一个预测试循环。这意味着它会在每次迭代之前测试其状态。如果测试表达式为 false,则循环将永远不会迭代。如果要确保一个 while 循环至少执行一次,则必须初始化相关的数据,使测试表达式一开始即为 true。

例如,注意上面程序中变量 count 的定义:

int count = 1;

count 变量被初始化为值 1。如果数字已经被初始化为大于 5 的值,则循环将永远不会执行,如下面的程序段所示:
int count = 6;
while (count <= 5)
{
    cout << "Hello ";
    count = count + 1;
}

无限循环

除极少数情况外,循环必须包括一种终止方式。这意味着循环中的某些内容必须最终使测试表达式为 false。在上面程序中,当表达式“count <= 5”变为 false 时,循环停止。

如果循环没有停止的方式,则称为无限循环。无限循环将持续重复,直到程序中断,示例如下:
int count = 1;
while (count<= 5)
{
    cout << "Hello ";
}
这是一个无限循环,因为它不包含更改 count 变量值的语句。每次测试表达式“count <= 5”时,count 的值都是 1。

小心分号

通过在 while 循环的第一行之后意外地放置一个分号也可以创建无限循环,示例如下:
int count = 1;
while (count <= 5) ; //该分号是一个错误
{
    cout << "Hello ";
    count = count + 1;
}
因为编译器在发现开始语句块的大括号之前看见了第一行末尾的分号,所以它会在分号的位置结束循环。尤其是它会将分号前面丢失的语句解释为空语句,也就是什么都不做的语句,然后将 while 语句和它后面的任何内容断开。

对于编译器来说,整个循环看起来就像下面这样:

while(count<= 5);

这个 while 循环将持续执行空语句,当然它永远不会执行任何操作。该程序似乎“陷入迷惘”,因为没有任何屏幕输出,也不会显示任何活动。

不要忘记大括号

在编写循环语句时,如果有条件执行的语句是一个语句块,则不要忘记将所有的语句都包含在一组大括号中。如果大括号意外被忽略,则 while 语句有条件执行的仅仅是下一个语句,请看下面的代码示例:
int count = 1;
//该循环忘记使用大括号
while (count <= 5)
    cout << "Hello ";
    count = count + 1;
在这段代码中,只有一个语句,也就是 cout 语句,是在 while 循环的主体中。给变量 count 加 1 的语句不在循环体内,所以 count 的值保持为 1,循环测试条件永远为 true。循环将一遍又一遍地打印“Hello”字符串,直到用户停止程序。

不要混清 == 与 =

循环的另一个常见陷阱是,在打算使用 == 运算符时,却意外地使用了 = 运算符。例如,以下示例就是一个无限循环,因为作为循环条件的测试表达式每次都给 remainder 赋值为 1,而不是测试 remainder 是否等于 1:
while (remainder = 1) //错误:条件表达式为赋值语句
{
    cout << "Enter a number: ";
    cin >> num;
    remainder = num % 2;
}
请记住,任何非零值都将被判断为 true。

do-while 循环

除了 while 循环之外,C++ 还提供了 do-while 循环。do-while 循环看起来类似于把一个 while 循环倒过来。图 3 显示了其格式和流程图,右侧流程图直观地描绘了其工作原理。

do-while循环的语句结构及流程图
图 3 do-while循环的语句结构及流程图

与 while 循环一样,如果循环体中只有一个有条件执行的语句,则可以省略大括号。注意,do-while 循环必须在测试表达式的右括号后用分号终止。

除了外观形式,do-while 循环和 while 循环之间的区别是 do-while 是一个后测试循环,这意味着在循环结束时,也就是在每次迭代完成后,才测试其表达式。因此,即使测试表达式在开始时为 false,do-while 也至少要执行一次迭代。

例如,在以下 while 循环中,cout 语句根本不会执行:
int x = 1;
while (x < 0)
    cout << x << endl;
但是在以下 do-while 循环中的 cout 语句将执行一次,因为 do-while 循环在迭代结束之前不会判断表达式 x<0:
int x = 1;
do
    cout << x << endl;
while (x < 0);
如果要确保循环执行至少一次,则应使用 do-while 循环。

for (; ; )和while (true) 没有区别

for (; ; )和while (true) 没有区别

看jdk源码的时候,很多地方都是用的for (; ; ),难道跟while (true)有何区别,用javap反汇编了下,实际是一样的

javap  -v  target.test-classes.com.example.demoweb.DemoWebApplicationTests

  源码

public class DemoWebApplicationTests {


    public void test1() {
        for (; ; ) {
            System.out.println(11);
        }
    }

    public void test2() {
        while (true) {
            System.out.println(11);
        }
    }
}  

  反汇编后代码

Warning: Binary file target.test-classes.com.example.demoweb.DemoWebApplicationTests contains com.example.demoweb.DemoWebApplicationTests
Classfile /Users/pigercc/IdeaProjects/demo-web/target/test-classes/com/example/demoweb/DemoWebApplicationTests.class
  Last modified Mar 15, 2019; size 632 bytes
  MD5 checksum 7c14c6fc2447db0f652238e10b70d796
  Compiled from "DemoWebApplicationTests.java"
public class com.example.demoweb.DemoWebApplicationTests
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #5.#18         // java/lang/Object."<init>":()V
   #2 = Fieldref           #19.#20        // java/lang/System.out:Ljava/io/PrintStream;
   #3 = Methodref          #21.#22        // java/io/PrintStream.println:(I)V
   #4 = Class              #23            // com/example/demoweb/DemoWebApplicationTests
   #5 = Class              #24            // java/lang/Object
   #6 = Utf8               <init>
   #7 = Utf8               ()V
   #8 = Utf8               Code
   #9 = Utf8               LineNumberTable
  #10 = Utf8               LocalVariableTable
  #11 = Utf8               this
  #12 = Utf8               Lcom/example/demoweb/DemoWebApplicationTests;
  #13 = Utf8               test1
  #14 = Utf8               StackMapTable
  #15 = Utf8               test2
  #16 = Utf8               SourceFile
  #17 = Utf8               DemoWebApplicationTests.java
  #18 = NameAndType        #6:#7          // "<init>":()V
  #19 = Class              #25            // java/lang/System
  #20 = NameAndType        #26:#27        // out:Ljava/io/PrintStream;
  #21 = Class              #28            // java/io/PrintStream
  #22 = NameAndType        #29:#30        // println:(I)V
  #23 = Utf8               com/example/demoweb/DemoWebApplicationTests
  #24 = Utf8               java/lang/Object
  #25 = Utf8               java/lang/System
  #26 = Utf8               out
  #27 = Utf8               Ljava/io/PrintStream;
  #28 = Utf8               java/io/PrintStream
  #29 = Utf8               println
  #30 = Utf8               (I)V
{
  public com.example.demoweb.DemoWebApplicationTests();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 11: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Lcom/example/demoweb/DemoWebApplicationTests;

  public void test1();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=1, args_size=1
         0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
         3: bipush        11
         5: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
         8: goto          0
      LineNumberTable:
        line 16: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      11     0  this   Lcom/example/demoweb/DemoWebApplicationTests;
      StackMapTable: number_of_entries = 1
        frame_type = 0 /* same */

  public void test2();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=1, args_size=1
         0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
         3: bipush        11
         5: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
         8: goto          0
      LineNumberTable:
        line 22: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      11     0  this   Lcom/example/demoweb/DemoWebApplicationTests;
      StackMapTable: number_of_entries = 1
        frame_type = 0 /* same */
}
SourceFile: "DemoWebApplicationTests.java"

  

for/while(do while)

for/while(do while)

//for循环用于知道次数的循环,while用于不知道的次数的循环
//
第1种写法 while循环 import java.util.Scanner;//插入util工具包 public class HelloWorld { public static void main(String[] args) { Scanner a=new Scanner(System.in);//控制台输入公式 int c=1; float d=0;
//while(条件判断){初始值;循环体;迭代}
while (c<=5) { System.out.println("请输入第"+c+"个学生成绩:"); float b=a.nextFloat();//初始值=控制台输入 d+=b;//循环体 c++;//迭代(每次+1,这样子就可以不用无限循环) } System.out.println("平均分为:"+(d/5)); } } //第2种写法 for循环 import java.util.Scanner; public class HelloWorld { public static void main(String[] args) { Scanner a=new Scanner(System.in); float d=0;
//for(初始值;条件;迭代){循环体}
for (int c=1;c<=5;c++) { System.out.println("请输入第"+c+"个学生成绩:"); float b=a.nextFloat(); d+=b; } System.out.println("平均分为:"+(d/5)); } }

 大家可以关注一下我的博客  我的博客所有随笔都是我从基础开始学习java的所有知识点

//do while (while是先判断后运行,do while是先运行后判断,两者的区别在于 do while是已经运行了一次)
public
class Ehth { public static void main(String [] args) { int a=0; int b=0; do{ a+=b; b++; } while (b<5); System.out.println(a); } }

 

Gmail中while(1)的作用是什么?

Gmail中while(1)的作用是什么?

如果您窥视Gmail更新电子邮件列表时Gmail向服务器发出的XHR POST请求,则您会看到每个响应均以:

while(1);[[["v","CKbPYpt__Vc.en.","8","d7634f09ff9e61c8"],["di",342],["ub",[["^i",1296218266987],["^f",1296218266987](...)

为什么Google会以无休止的循环开始每个响应?

我读到这是一个安全技巧,http://my.opera.com/hallvors/blog/show.dml/260127,但是我不确定这应该是一种好的安全措施。

答案1

小编典典

进行猜测…以便eval对响应做出任何恶意尝试或将<script>块指向资源,而不是正确地对其进行解析,都将失败。

关于while1vs. while的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于C++ while(do-while)循环详解、for (; ; )和while (true) 没有区别、for/while(do while)、Gmail中while(1)的作用是什么?等相关知识的信息别忘了在本站进行查找喔。

本文标签: