[英]Why does this compile? [C++]
我试图在网上寻找答案,但找不到。
今天,我看到了以下代码行:
int main(){
int n = 7;
while(n /= 10);
}
这没有多大意义,但问题仅仅是“会编译吗?”。 我对此没有回答,但是我错了。
我的问题是,为什么? 为什么
n /= 10
在这里表现像布尔(或整数)?
赋值(包括类似/=
的复合赋值)是一个表达式,其产生被赋值为1的值。
因此,您可以执行以下操作: x = y = z = 0;
,将0分配给z
,将其结果(也为0)分配给y
,并将其结果(仍为0)分配给x
。
从那里开始,它利用从int
到bool
的隐式转换,其中0
转换为false
,任何非零值都转换为true
。
1.注意:内置类型就是这种情况。 按照惯例,当/如果您对一个类重载operator=
,可以让它return *this;
,因此它的工作方式与用户期望/将要达到的预期方式相同-但那不是强制性的-您可以使 operator=
重载以返回不同的值或完全不同的类型-但这几乎总是一个坏主意并且通常应避免使用。
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 );
仍然可以编译,但是循环将无限继续。
就像+=
和-=
有效, *=
和/=
有效。
实际上,也有&=
和|=
。
这些都将评估为已分配的新值。
而且,如您所知,您不必while
/ for
/ if
条件中放置一小段布尔值; 您只需要在此处放置可以转换为布尔值的内容即可。
例如, if (42)
或for (char* ptr = begin; ptr; ++ptr)
或while (n /= 10)
。
C ++会将n / = 10转换为bool。 将Integers = 0转换为bool会得出false。 整数!= 0转换为bool的结果为true。 该while将被评估为while(false)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.