我试图在网上寻找答案,但找不到。
今天我看到了以下代码行:
int main(){
int n = 7;
while(n /= 10);
}
这没有多大意义,但问题只是“它会编译吗?”。 我对此没有回答,但是我错了。
我的问题是,为什么?为什么
n /= 10
在这里像布尔(或int)一样?
答案 0 :(得分:9)
赋值(包括诸如/=
这样的复合赋值)是一个表达式,其产生被赋值的值 1 。
因此,您可以执行以下操作:x = y = z = 0;
,将0分配给z
,将其结果(也是0)分配给y
,并获取结果(仍然为0),并将其分配给x
。
从那里开始,它利用从int
到bool
的隐式转换,其中0
转换为false
,任何非零值都转换为{ {1}}。
1.注意:内置类型就是这种情况。按照惯例,当/如果您在类中重载true
时,就会拥有operator=
,因此它的工作方式与用户期望/期望的方式相同-但那不是强制性的-您可以使您的return *this;
重载以返回不同的值或完全不同的类型-但这几乎总是一个坏主意,通常应避免。
答案 1 :(得分:2)
while循环中的内容如下:
while ( expression );
如果表达式是true
或non 0
,则循环将继续;否则,循环将继续。否则,如果结果为false
或0
,它将终止。因此,回头看原始照片:
int n = 7;
while ( n /= 10 );
然后变成:
while ( n = 7 / 10 );
此处的完整表达式为n = 7 / 10
;由于整数算术的截断,因此应导致0
。通过从int
到bool
的隐式转换,该值变为false
。由于产生的结果是0
。
这里没有阻止它编译的内容。因为这与拥有相同:
while ( false );
但是具有赋值和算术运算;可能并非总是如此,但您的情况确实如此。考虑下一个示例:它仍然可以编译,但是循环不会终止:
int n = 5;
while( n + n );
然后它将变为:
while( 5 + 5 );
...
while( 10 );
...
while( true );
仍然可以编译,但是循环将无限继续。
答案 2 :(得分:0)
就像+=
和-=
一样,*=
和/=
一样工作。
实际上,还有&=
和|=
。
所有这些都评估为已分配的新值。
而且,正如您所知,您不必在while
/ for
/ if
条件中放入布尔值;您只需要在其中放置可以转换为布尔值的内容即可。
例如if (42)
或for (char* ptr = begin; ptr; ++ptr)
或while (n /= 10)
。
答案 3 :(得分:-1)
C ++会将n / = 10转换为bool。将Integers = 0转换为bool会得出false。整数!= 0转换为bool的结果为true。
该时间将被评估为while(false)
。