0

演算子++はと同等である必要があります+ 1が、次の例で異なる結果が得られるのはなぜですか?

#include <iostream>
#include <string>

int main()
{
    int i, n=25;
    std::string s1="a", s2="a", s1p="", s2p="";

    for (i=0;i<=n;i++)
    {
        s1p += s1;
        s1 = s1.at(0) + 1;

        s2p += s2;
        s2 = s2.at(0)++;
    }
    std::cout << "s1p = " << s1p << "\n" << "s2p = " << s2p << "\n";

    return 0;
}

Ouput:
s1p = abcdefghijklmnopqrstuvwxyz
s2p = aaaaaaaaaaaaaaaaaaaaaaaaaa
4

3 に答える 3

9

ポストインクリメントは、変数が以前に保持していた値を返します。

x++ポストインクリメント)を次のように考えます

int y = x;
x = x+1;
return y;

および++xpre-increment)として

x = x+1;
return x;

目的の結果を得るには、事前インクリメントが必要です。

于 2012-06-20T07:03:36.080 に答える
4

ステートメント:

s2 = s2.at(0) ++;

控えめに言っても、好奇心が強いです。s2同じステートメントで2回変更しています。組み込み型では、これは未定義の動作になります。ユーザー定義のタイプ(のようなstd::string)では、混乱を招きます。また、++の副作用は、を呼び出す前に発生する必要があるためoperator=++事実上何もしません。の文字の変更は s2、割り当てによって上書きされます。

最初の文字に基づいて(そして文字列に含まれる可能性のある追加の文字を無視して)文字列にまったく新しい値を割り当てることが目標である場合は、の変更がs1正しい解決策です。文字列の最初の文字を変更し、他の文字は変更しないことを目標としている場合、正しい解決策は 、割り当てなしs.at(0) ++で、++ s.at(0)または、です。s.at(0) += 1(2つ目は、結果が他の方法で使用されない場合に最も慣用的なものです。)そしてもちろん、アルファベットの連続する文字列を作成する場合は、次のようにします。

std::string s;
for ( char ch = 'a'; ch <= 'z'; ++ ch ) {
    s += ch;
}

最も慣用的なものになります(形式的には間違っており、一部の環境では機能しません。アルファベットの文字がエンコーディングで連続するコードポイントを占めるという保証はありません)。

于 2012-06-20T07:27:24.853 に答える
2

++と+1は同等ではありません。代用するには、 (または必要に応じて)n++;使用する必要があります。++は実際には変数をインクリメントしますが、+1は算術演算の結果を返すだけです。また、n++と++nの動作が異なることにも注意してください。n = n+1;n+=1

n = 1;
i = 1;

a = ++n;
b = i++;
c = i;

a、b、cの出力は次のようになります

a: 2
b: 1
c: 2 
于 2012-06-20T07:23:19.550 に答える