簡體   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