以下代码
#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(试图摆脱怀疑:))
答案 0 :(得分:7)
如果减法的结果为零,test
将为假;否则就是真的。
任何数值类型,枚举类型或指针的值都可以转换为布尔值;如果值为零(或指针为null),则结果为false;否则结果是真的。
答案 1 :(得分:5)
整数类型,浮点类型和指针类型都可以转换为bool。对于所有这些,值0将转换为false,非零值将转换为true。
因此,如果s2 - s1
的计算结果为0,则test
为假。否则,test
为真。
由于s1
和s2
是指针,s2 - s1
正在给出它们之间的差异(地址相隔多远)。如果它们指向相同的地址,则差值将为0.如果它们指向不同的地址,则结果将为非零。因此,实际上所有test
都表示s1
和s2
是否指向不同的地址。 s1 != s2
会得到完全相同的结果,可能更有意义。
然而,鉴于对值s1
和s2
是硬编码的,并保证为指向不同的地址,测试并没有真正任何意义。它可以在其它程序意义虽然 - 特别是一个地方s1
和s2
被传递给函数,你有没有提前知道的方式,他们是否真的在同一个
答案 2 :(得分:2)
行bool test = s2-s1
执行指针减法,给出char
与s2
分开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纠正我。