2016-05-14 17 views
-2

私はSubstract文字列 - int型の結果

a[]="informatics"; 
cout<<strchr(a, 't')-(a+3); 

を使用した後、結果4を得るのですか、なぜ誰もが説明できますが、私は-4の結果を得るべきではないでしょうか。

"ormatics"から短い文字列("tics")を減算するためです。私の意見では、"ormatics-tics"があれば、数値ではなく、ormaという文字列を返すのが理にかなっています。

なぜですか、私はこのことの参照を見つけることができません。私は何strchr戻って自分自身をやった後、私は、同じことをしようとしたときも、私は-4を得た:

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

誰かがしてください説明できますか?

+3

あなたが引いているポインタではなく、文字列を分離要素の数です。 – chris

+2

あなたは文字列ではなくポインタを減算しています。 –

+0

@owacoderしかし私は4-8をしていません8-4 – Isengardium

答えて

2

あなたはポインタの減算をしています。

これは何が起こっているかである:あなたが引く:

enter image description here

のでstrchr(a, 't')-(a+3)は注意

*簡単にするために0するaを考慮*、

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

です2つのポインタ、限り彼らは 同じ配列に指して、結果は彼らに

Source

1
" tics"-"ormatics" 

2つの任意のconst char*ポインタを減算します。その違いについての予測はできません。

実際の文字列の内容とはまったく関係ありません。

+0

実際、それよりも悪いです。プログラムがその式を評価すると、そのプログラムの結果についての予測はできません。 (これは "未定義の振る舞い"です。)疑念を避けるため、@πάνταῥεῖはこれを知っていますが、OPはおそらくそうではありません。 –

+0

@MartinBonnerいいえ "チック" - "オマミックス"は_はUBではありません。それは単に合理的に予測可能な結果を​​与えていないだけです。それはUBを呼び出すこととは大きく異なります。 –

+0

@πάνταῥεῖ - これは、(もしこのルールがC++とCで緩和されない限り)同じ配列の要素を指す場合にのみポインタを減算することができます。 –

3

aは、"informatics"を含むchar配列の最初の文字へのポインタを保持します。

strchr(a, 't')は、最初の "t"(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

(これを指摘するためにあなたにマーティン・ボナーをありがとうございます。)

+0

ああ、そうだ。今、私は分かる。どうもありがとうございました。 – Isengardium

+1

'a'は、char配列の最初の文字へのポインタを保持しません。 *は*文字配列です。それが式で使用されるとき、通常は最初の文字へのポインタに減衰します。 –

+0

@MartinBonnerこれは実際より正確です。ユースケースがこの目立つ私の答えを編集する前に? 'a [x]'は(AFAIK)が '*(a + x)'に等しいとします。 – chocolateftw

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". 
+0

私は今理解しています。ありがとうございました。 – Isengardium

関連する問題