2010-06-09 58 views
0

下面的代码确定真/假

#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(试图摆脱疑虑的:))

回答

7

如果减法的结果是零,test会是虚假的;否则它会是真的。

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

+0

AHK,还什么S2-S1实际上评价?字符串的长度? – silent 2010-06-09 00:31:30

+6

@ sil3nt:它返回两个指针之间的差异。 's1'和's2'只是指针。在这种情况下's2-s1 = 7',因为's2'指向char数组的第七个元素,'s1'指向char数组的第零个元素(开头)。 – 2010-06-09 00:33:11

+0

只是为了澄清一点,指针在下面是真正的整数,它将地址(字节偏移量)保存到内存位置。所以,如果你做指针算术,它实际上是用底层的内存地址(数字)来进行算术。结果是另一个指针(整数),然后隐式转换为bool并分配给'test'。 – Cameron 2010-06-09 01:02:37

1

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

感谢纳森S.和个人纠正我。

+5

请注意,它不会减去字符串中的字符,它会像@James McNellis所评论的那样减去指针。 – 2010-06-09 00:37:25

+3

它当然不会将null转换为ascii零,ascii zero不是false,而是0x30。大量的错误信息在这里。 – indiv 2010-06-09 00:38:54

5

整数类型,浮点类型和指针类型都可转换为布尔值。对于它们全部,值0转换为假,非零值转换为真。

所以,如果s2 - s1评估为0,那么test是错误的。否则,test为真。

由于s1s2是指针,s2 - s1给出它们之间的区别(地址有多远)。如果它们指向相同的地址,则差值将为0.如果它们指向不同的地址,则结果将不为零。所以,test确实全部表示是否s1s2指向不同的地址。 s1 != s2会给出完全相同的结果,并可能更有意义。

但是,鉴于s1s2的值是硬编码的并且保证指向不同的地址,所以测试没有任何意义。然而,在另一个程序中它可能是有意义的 - 尤其是s1s2正在传递给一个函数,并且您无法提前知道它们是否真的相同。

+0

如果使用这个测试来确定两个指针是否指向相同的位置,那么只要说'bool test =(s1!= s2);':-)就会清晰得多 – Cameron 2010-06-09 01:01:00