簡體   English   中英

確定是非

[英]determining True/False

以下代碼

#include <iostream>
using namespace std;

int main(){
    char greeting[50] = "goodmorning everyone";
    char *s1 = greeting;
    char *s2 = &greeting[7];

    bool test = s2-s1;

    cout << "s1 is: " << s1 << endl;
    cout << "s2 is: " << s2 << endl;
    if (test == true ){
        cout << "test is true and is: " << test << endl;
    }

    if (test == false){
        cout<< "test is false and is: " << test << endl;
    }

    return 0;
}

輸出:

s1 is: goodmorning everyone
s2 is: ning everyone
test is true and is: 1

這里的bool test = s2-s1; 實際求值?是字符串的長度嗎? 如果是這樣,則看到s2小於s1,它應該為負正確嗎?,而輸出為true。

另外,如果我將其更改為bool test = s1-s2; 我仍然得到相同的結果。 因此,不管它的消極還是積極的事實都是true 並且只有0時為false。

s2-s1是什么意思?

歡呼(努力擺脫疑慮:)

如果相減的結果為零,則test為假;否則為零。 否則它將是真實的。

任何數值類型,枚舉類型或指針的值都可以轉換為布爾值; 如果值為零(對於指針,則為null),則結果為false;否則,結果為false。 否則結果為true。

整數類型,浮點類型和指針類型都可以轉換為bool。 對於所有這些,值0會轉換為false,而非零值會轉換為true。

因此,如果s2 - s1評估為0,則test為假。 否則, test為真。

由於s1s2是指針,因此s2 - s1給出它們之間的差(地址有多遠)。 如果它們指向相同的地址,則差將為0。如果它們指向不同的地址,則結果將為非零。 因此,實際上所有test表明s1s2是否指向不同的地址。 s1 != s2將給出完全相同的結果,並且可能更有意義。

但是,鑒於s1s2的值是硬編碼的,並且保證指向不同的地址,因此該測試實際上沒有任何意義。 不過,在另一程序中可能會有意義-尤其是將s1s2傳遞到函數中的程序,您無法提前知道它們是否真的相同。

bool test = s2-s1指針減法,給出將s2s1分開的char s的數量。 然后,僅當結果為0時,才將結果轉換為false從而將該結果轉換為bool,否則將其轉換為true

有關添加/減去指針時發生的情況的詳細說明,請參見: http : //www.cs.umd.edu/class/spring2003/cmsc311/Notes/BitOp/pointer.html

C ++允許隱式轉換,因此它正在做的是從另一個數組中減去一個數組的指針值,如果結果為null,則它隱式將null轉換為false。 其他任何事情都將是真實的,因為布爾的工作方式使其為零(假)或真實。

感謝Nathan S.和indiv糾正我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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