确定真/假

时间:2010-06-09 00:28:41

标签: c++ gcc boolean

以下代码

#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小,它应该是负的正确?,但是输出是真的吗?。

此外,如果我将其更改为bool test = s1-s2;,我仍然会得到相同的结果。因此它的负面或正面是true无关紧要? 0时只有假?

s2-s1是什么意思?

-cheers(试图摆脱怀疑:))

4 个答案:

答案 0 :(得分:7)

如果减法的结果为零,test将为假;否则就是真的。

任何数值类型,枚举类型或指针的值都可以转换为布尔值;如果值为零(或指针为null),则结果为false;否则结果是真的。

答案 1 :(得分:5)

整数类型,浮点类型和指针类型都可以转换为bool。对于所有这些,值0将转换为false,非零值将转换为true。

因此,如果s2 - s1的计算结果为0,则test为假。否则,test为真。

由于s1s2是指针,s2 - s1正在给出它们之间的差异(地址相隔多远)。如果它们指向相同的地址,则差值将为0.如果它们指向不同的地址,则结果将为非零。因此,实际上所有test都表示s1s2是否指向不同的地址。 s1 != s2会得到完全相同的结果,可能更有意义。

然而,鉴于对值s1s2是硬编码的,并保证为指向不同的地址,测试并没有真正任何意义。它可以在其它程序意义虽然 - 特别是一个地方s1s2被传递给函数,你有没有提前知道的方式,他们是否真的在同一个

答案 2 :(得分:2)

bool test = s2-s1执行指针减法,给出chars2分开s1的数量。然后,当且仅当结果为0时,转换为false,然后将此结果转换为bool,否则转换为true

有关添加/减去指针时发生的情况的详细说明,请参阅: http://www.cs.umd.edu/class/spring2003/cmsc311/Notes/BitOp/pointer.html

答案 3 :(得分:1)

C ++允许隐式转换,因此它正在做的是从另一个数组中减去一个数组的指针值,如果结果为null,则它隐式地将null转换为false。其他任何事情都是真的,因为bools的工作原理是零(假)或真。

感谢Nathan S.和indiv纠正我。