繁体   English   中英

为什么会编译? [C ++]

[英]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

从那里开始,它利用从intbool的隐式转换,其中0转换为false ,任何非零值都转换为true


1.注意:内置类型就是这种情况。 按照惯例,当/如果您对一个类重载operator= ,可以让它return *this; ,因此它的工作方式与用户期望/将要达到的预期方式相同-但那不是强制性的-您可以使 operator=重载以返回不同的值或完全不同的类型-但这几乎总是一个坏主意并且通常应避免使用。

while循环在这里的内容如下:

while ( expression );

如果表达式为true non 0则循环将继续;否则,循环将继续。 否则,如果结果为false0 ,它将终止。 因此,回顾一下您的原始照片:

int n = 7;
while ( n /= 10 );

然后变成:

while ( n = 7 / 10 ); 

这里的完整表达式是n = 7 / 10 ; 由于整数算术的截断,这将导致0 通过从intbool的隐式转换,该值将变为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM