[英]Why a condition that contains a pointer always returns true?
例如,考慮以下代碼。 指針p
指向包含非零值的變量a
。 意思是,條件應該為真。 因此,如果程序返回1,我對此沒有任何問題。
#include <iostream>
int main()
{
int *p, a = 1;
p = &a;
if(p)
{
return 1;
}
return 0;
}
但是對於以下程序,結果也相同。 盡管這次指針指向一個包含0的變量。因此,條件應該為false,但不是。
#include <iostream>
int main()
{
int *p, a = 0;
p = &a;
if(p)
{
return 1;
}
return 0;
}
那么,我想念的是什么? 為什么條件總是返回真? 我假設指針與它指向的值無關。 相反,它是在其他條件的基礎上評估病情,我想知道那個特殊原因。
空指針將隱式轉換為布爾值false,而非空指針將轉換為true。 根據C ++ 11標准,關於布爾轉換的部分:
算術,無作用域枚舉,指針或指向成員類型的指針的prvalue可以轉換為bool類型的prvalue。 零值,空指針值或空成員指針值將轉換為false; 其他任何值都將轉換為true。 可以將std :: nullptr_t類型的prvalue轉換為bool類型的prvalue; 結果值是假的
用這個:
if(*p)
代替
if(p)
*p
取消引用指針,產生值。 p
只是一個擁有另一個變量地址的對象。
這里的問題在於您的if語句的情況:
if (p)
這是因為在p
,存儲值&a
,這是變量a
的地址,值存儲在變量中, 而不是變量本身。
當我編譯並運行程序時, a
的地址為0x7fff0d9fd274
,並且不為零。 如果if語句條件中的任何值都不為零,則該值始終為true
。 其結果是,您的病情得到驗證,即使在值a
改變,因為你的編譯器甚至不看的價值a
; 它僅檢查存儲為p
的值的地址是否為零,不是。 因此,您的if語句始終為true,因此程序始終會返回非零狀態來終止。
要解決此問題,您應該使用*p
而不是p
。 該語法告訴編譯器從指針p
存儲的地址中獲取值,在第二個程序中該值為零。
在第二個程序中將if條件更改為:
if (*p)
將以您希望的狀態以零狀態終止程序。
希望這可以幫助!
if (p)
確實返回true,因為if (p)
是if (p != nullptr)
快捷方式。
p
包含變量a
的內存地址。 在我的機器上是0x29fef8
。 由於nullptr
等於0
並且p不為0
因此條件if (p != nullptr)
計算為true。 因此,條件始終返回true。
在C語言中,指針由兩個運算符與變量相關: takeaddress (由“&”字符或&表示) 和解引用(由星號或*****表示)。
首先,您應該記住一個指針保存一個內存位置的地址。 因此,您的行p =&a; 將int變量a
的地址放入指針變量p
。 該地址肯定不是null,因為a是一個存在變量,帶有真實地址。
這就是為什么您的p
值測試將始終成立的原因。
如果要測試由p
保留的地址的內容-即a
的值,則應取消引用它。 換句話說,您的代碼應為:
#include <iostream>
int main()
{
int *p, a = 0;
p = &a;
if(*p)
{
return 1;
}
return 0;
}
if (p)
始終為true,直到p
沒有指向任何東西(地址0x)。 我認為您真正想做的是if (*p)
以便您評估地址p
指向的值。 *
用於訪問地址中的信息。
請記住,指針保留地址而不是值,因此p = &a
和*p = a
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.