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