在我的考试中,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--;
}
}
输出是什么? 我认为它应该进入无限循环!
答案 0 :(得分:13)
不,它不会进入无限循环:
while (i=0) { /* this code is never run */ }
说明:
i = 0;
评估为0
,条件为“假”。
答案 1 :(得分:13)
while (i = 0)
将将值<0>分配给i
,然后检查表达式的值(指定的值,即0)是否为非零。换句话说,它甚至不会执行循环体...它只是将i
设置为0.它还会对任何体面的编译器发出警告,因为这是一个常见的拼写错误。
遵循相同的逻辑,while (i = 1)
会将值1分配给i
,而总是执行循环体...只有循环内的中断(或异常)会终止它。
(许多其他语言没有广泛的问题,因为它们需要在诸如while和if之类的条件下表达布尔类型。但是这些语言仍然经常遇到while (b = false)
的问题。)< / p>
答案 2 :(得分:4)
该程序不会打印任何内容。循环
while(i=0)
是赋值而不是比较,这意味着它会将i
赋值为零,然后计算为i
的新值(即零)。 C ++将零值解释为false,因此循环根本不会执行。
答案 3 :(得分:3)
第二个循环不会打印任何内容。
while( i = 0 )
将作为
while( ( i = 0 ) != 0 )
这相当于
i = 0;
while( i != 0 )
显然与
相同i = 0;
while( false )
答案 4 :(得分:3)
i = 0
:将值0赋给变量i
i == 0
:测试变量i的值为0
许多程序员建议在表达式的左侧放置您正在测试的值以避免这种常见错误,例如:
while (0 == i)
会评估,但while (0 = i)
会报告错误。
答案 5 :(得分:2)
while (i = 0)
:0将被分配给i
,然后将评估表达式。它的值为0,因此while循环将立即终止。有时编译器会向您发出警告。
while (i == 0)
:i
与0进行比较(没有任何赋值),当i
不等于0时,while循环终止。
为了避免这种错误,一些程序员编写while (0 == i)
,然后while (0 = i)
无效。
答案 6 :(得分:1)
while (i=0)
会将i
设置为0,然后检查i
是否为“true”,即非零。 i
永远不会非零,因此条件被视为false
并跳过循环。
答案 7 :(得分:1)
在使用优化进行编译时,C ++编译器甚至不会编译while
循环的主体,因为它知道它永远不会被输入。
答案 8 :(得分:1)
输出是什么?这取决于用户输入。如果你输入一个字符串,我相信它会抛出异常。如果用户输入n
的负数,它也可能抛出异常。在我的测试中,我遇到了分段错误:http://codepad.org/i1Z2iQFe
否则,正如其他人所说的那样,什么都不输出,因为while循环中的表达式总是计算为false。 i = 0
始终求值为0,在C ++中总是求值为false
。
另请注意,此代码无法删除A
,这是一个坏主意,并且在较大的程序中会产生内存泄漏。
答案 9 :(得分:1)
要获得一些额外的分数,请写下您可以使用while (0 == i)
之类的语法来避免此类意外分配。