繁体   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