while(i=0)和while(i==0)的区别

6
在我的考试中,出现了以下与C++相关的问题。
代码:
int i, n;
int* A
cin >> n;
A = new int[n]
for(int i = 0; i < n; i++) cin >> A[i];

while(i = 0){
   cout << A[i] << endl;
   i--;
}
}

输出结果会是什么? 我认为它应该进入无限循环!


"while (i=0)" 不应编译,因为 while 期望布尔表达式而不是赋值表达式。 - Furqan Hameedi
1
实际上,(i=0) 在 C++ 中被认为是一个布尔表达式,它的值为整数 0。 - jwenting
8
@Furqan,这是C ++代码,并且需要进行编译。 - Dante May Code
while (i = 0)会编译通过,因为operator=(int,int)返回一个左值的引用(在这种情况下是i)。while循环将把0赋值给i,然后将i作为bool进行评估,结果为false。 - Collin Dauphinee
2
值得一提的是,任何像样的编译器都会在这种情况下发出警告,并建议将影响放在额外的括号中以明确指定意图。 - ereOn
显示剩余4条评论
10个回答

13

不,它不会进入无限循环:

while (i=0) { /* this code is never run */ }

解释:

i = 0;

求值结果为0,在条件语句中表示"false"。


13

while (i = 0) 将会给 i 赋值为 0,然后检查表达式的值(即被赋值的值,即 0)是否非零。换句话说,它不会执行循环体一次,只会将 i 设为 0。如果使用一个合理的编译器,它也会引发警告,因为这是一个常见的打字错误。

按照相同的逻辑,while (i = 1) 会将值 1 赋给 i 并且始终执行循环体...只有在循环内部执行 break(或异常)时才会终止循环。

(许多其他语言不会像这样广泛存在此问题,因为它们需要布尔类型的表达式作为 while 和 if 等条件。但这些语言仍然经常出现 while (b = false) 的问题。)


4
该程序不会打印任何输出。循环将一直运行,直到达到指定条件。
while(i=0)

这是一个赋值语句而不是比较语句,这意味着它将会把i赋值为零,然后计算出i的新值(即零)。在C++中,零被解释为假,因此循环根本不会执行。


3
第二个循环不会打印任何东西。
while( i = 0 )

将作为...工作。
while( ( i = 0 ) != 0 )

这将等同于

i = 0;
while( i != 0 )

这明显与

相同。
i = 0;
while( false )

3

i = 0:将值0分配给变量i

i == 0:测试变量i是否为值0

许多程序员建议在表达式的左侧放置要测试的值,以避免这种常见错误,例如:

while (0 == i) 将被计算,然而 while (0 = i) 将报告一个错误。


2

while (i = 0): 将0赋值给i,然后计算表达式的值。其值为0,因此while循环将立即结束。有时编译器会对此发出警告。

while (i == 0): 比较i和0(没有任何赋值),当i不等于0时,while循环将终止。

为避免这种错误,一些程序员会写成while (0 == i),而while (0 = i)是无效的。


1

while (i=0) 会导致 i 被设置为 0,然后检查 i 是否为“真”,即非零。由于 i 永远不会是非零值,所以条件被视为 false,循环被跳过。


1

当使用优化编译时,C++编译器甚至不会编译while循环的主体,因为它知道永远不会进入该循环。


1

输出结果会是什么?这取决于用户的输入。如果您输入一个字符串,我相信它会抛出异常。如果用户为n输入负数,它也可能会抛出异常。在我的测试中,我得到了一个分段错误:http://codepad.org/i1Z2iQFe

否则,就像其他人说的那样,由于while循环中的表达式始终评估为false,因此不会输出任何内容。i = 0始终评估为0,在C++中始终评估为false

还要注意,这段代码未能删除A,这是一个坏主意,在更大的程序中会创建内存泄漏。


1
为了获得一些额外的分数,可以写出这样的语法来避免这种意外赋值:while (0 == i)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接