代码:
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--;
}
}
输出结果会是什么? 我认为它应该进入无限循环!
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) { /* this code is never run */ }
解释:
i = 0;
求值结果为0
,在条件语句中表示"false"。
while (i = 0)
将会给 i
赋值为 0,然后检查表达式的值(即被赋值的值,即 0)是否非零。换句话说,它不会执行循环体一次,只会将 i
设为 0。如果使用一个合理的编译器,它也会引发警告,因为这是一个常见的打字错误。
按照相同的逻辑,while (i = 1)
会将值 1 赋给 i
并且始终执行循环体...只有在循环内部执行 break(或异常)时才会终止循环。
(许多其他语言不会像这样广泛存在此问题,因为它们需要布尔类型的表达式作为 while 和 if 等条件。但这些语言仍然经常出现 while (b = false)
的问题。)
while(i=0)
这是一个赋值语句而不是比较语句,这意味着它将会把i
赋值为零,然后计算出i
的新值(即零)。在C++中,零被解释为假,因此循环根本不会执行。
while( i = 0 )
while( ( i = 0 ) != 0 )
这将等同于
i = 0;
while( i != 0 )
这明显与
相同。i = 0;
while( false )
i = 0
:将值0分配给变量i
i == 0
:测试变量i是否为值0
许多程序员建议在表达式的左侧放置要测试的值,以避免这种常见错误,例如:
while (0 == i)
将被计算,然而 while (0 = i)
将报告一个错误。
while (i = 0)
: 将0赋值给i
,然后计算表达式的值。其值为0,因此while循环将立即结束。有时编译器会对此发出警告。
while (i == 0)
: 比较i
和0(没有任何赋值),当i
不等于0时,while循环将终止。
为避免这种错误,一些程序员会写成while (0 == i)
,而while (0 = i)
是无效的。
while (i=0)
会导致 i
被设置为 0,然后检查 i
是否为“真”,即非零。由于 i
永远不会是非零值,所以条件被视为 false
,循环被跳过。
当使用优化编译时,C++编译器甚至不会编译while
循环的主体,因为它知道永远不会进入该循环。
输出结果会是什么?这取决于用户的输入。如果您输入一个字符串,我相信它会抛出异常。如果用户为n
输入负数,它也可能会抛出异常。在我的测试中,我得到了一个分段错误:http://codepad.org/i1Z2iQFe
否则,就像其他人说的那样,由于while循环中的表达式始终评估为false,因此不会输出任何内容。i = 0
始终评估为0,在C++中始终评估为false
。
还要注意,这段代码未能删除A
,这是一个坏主意,在更大的程序中会创建内存泄漏。
while (0 == i)
。
C ++
代码,并且需要进行编译。 - Dante May Codewhile (i = 0)
会编译通过,因为operator=(int,int)
返回一个左值的引用(在这种情况下是i
)。while
循环将把0赋值给i
,然后将i
作为bool
进行评估,结果为false。 - Collin Dauphinee