Substract字符串 - int结果

时间:2016-05-14 18:44:18

标签: c++

任何人都可以解释为什么在使用

后得到结果4
a[]="informatics";
cout<<strchr(a, 't')-(a+3);

我不应该得到-4的结果吗?

因为我从"tics"中减去了较短的字符串("ormatics")。在我看来,如果我有"ormatics-tics",那么返回一个字符串orma,而不是一个数字是有意义的。

为什么会这样,我无法找到这件事的参考。另外,当我尝试同样的事情时,在我完成strchr返回后,我得到了-4

cout<<" tics"-"ormatics";`

有人可以解释一下吗?

4 个答案:

答案 0 :(得分:3)

a保存指向包含"informatics"的char数组的第一个字符的指针。

strchr(a, 't')返回指向第一个&#34; t&#34;的指针。 (这是第8个字符) 结果是a+7

因此您的计算结果为:
strchr(a, 't')-(a+3) == (a+7)-(a+3) == 7-3 == 4

修改
这个答案有点误导,因为它暗示a是一个指针 这是错的! a是一个数组而不是指针 这里的差异最好解释一下:c-faq - Arrays and Pointers

更好的措辞是数组通常像指针一样使用,因为有些操作只使用数组第一个元素的地址。
改进的计算可能如下所示:
strchr(a, 't')-(a+3) == (&a[0] +7)-(&a[0] +3) == 7-3 == 4

(感谢Martin Bonner指出这一点。)

答案 1 :(得分:2)

你正在做一个指针减法。

这就是发生的事情:

enter image description here

所以strchr(a, 't')-(a+3)是,

(0+7)-(0+3) => 4

*为简单起见,我认为a0

  

注意:当你减去两个指针时,只要它们指向   相同的数组,结果是分隔它们的元素数量

Source

答案 2 :(得分:1)

" tics"-"ormatics"

减去两个任意const char*指针。不能对差异做出任何预测。

与他们实际的字符串内容完全没有关系。

答案 3 :(得分:0)

让我举出你的例子:

const char a[]="informatics";    // a is an array with 12 elements (inc terminator).
const char* const pa = a;        // pa is a pointer to char.  Let us say for the sake of 
                                 // argument it has value 0x1000
const auto pt = strchr(a,'t')    // pt will be a pointer with value 0x1007
const auto ap3 = a+3             // ap3 will be a pointer with value 0x1003
const auto diff = pt - ap3;      // diff will be type ptrdiff_t, and given the values
                                 // above, you shouldn't be surprised it has
                                 // value 4.
std::cout<<diff<<std::endl;      // Will output "4".