簡體   English   中英

為什么包含指針的條件始終返回true?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM