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

时间:2018-12-17 21:25:41

标签: c++ compilation

我试图在网上寻找答案,但找不到。

今天我看到了以下代码行:

    int main(){
    int n = 7;
    while(n /= 10);
    }

这没有多大意义,但问题只是“它会编译吗?”。 我对此没有回答,但是我错了。

我的问题是,为什么?为什么

    n /= 10

在这里像布尔(或int)一样?

4 个答案:

答案 0 :(得分:9)

赋值(包括诸如/=这样的复合赋值)是一个表达式,其产生被赋值的值 1

因此,您可以执行以下操作:x = y = z = 0;,将0分配给z,将其结果(也是0)分配给y,并获取结果(仍然为0),并将其分配给x

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


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

答案 1 :(得分:2)

while循环中的内容如下:

while ( expression );

如果表达式是truenon 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 );

仍然可以编译,但是循环将无限继续。

答案 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)