0

了解しました。現在、C ++を学習中です。チュートリアルのいずれかを使用しているときに奇妙な効果が発生しましたが、それが発生している間はうまくいきません。

チュートリアル(提供された例からコピー)では、charが小文字であるかどうかをチェックし、それを大文字にするクラステンプレート特殊化内の関数を作成しました。

char uppercase ()
{
    //checks to see if "element"(char) is a lower-case letter between 'a' and 'z'
    if ((element >= 'a') && (element <= 'z'))
    {
        //changes value of "element" to be element + (value of A - Value of a)[-32]
        element += 'A' - 'a'; //element = element + -32
        return element;
    };
};

さて、奇妙なことに.. charがすでに大文字であっても、このコードはトリガーされます。したがって、値が「j」の関数を呼び出すと、意図したとおり、明らかに「J」が得られます。ただし、「J」の値を指定して呼び出すと、関数は引き続き実行されます。したがって、関数は何も変更せず、代わりに「*」を返します。

ここで、興味深いことに、ifステートメントから角かっこを削除すると、意図したとおりに機能します。だから、

char uppercase ()
{
    //checks to see if "element"(char) is a lower-case letter between 'a' and 'z'
    if ((element >= 'a') && (element <= 'z'))
        //changes value of "element" to be element + (value of A - Value of a)[-32]
        element += 'A' - 'a'; //element = element + -32
        return element;
};

意図したとおりに完全に機能します。値「J」を指定して関数を呼び出すと、条件が満たされていないため、コードが実行されなかったため、「J」が返されます。これで、中括弧はifステートメントではオプションであることがわかりましたが、チュートリアルでは、複数のステートメントには中括弧が必要であると述べています。

中括弧を使用してステートメントにelseを追加すると、目的の効果が得られることにも注意してください。ただし、これは不要ですよね?

それで、基本的に..中かっこについて何かが足りないのですか、それともこれはコンパイラー(Visual Studio 2012)の問題ですか?

4

3 に答える 3

3

これは設計ごとであり、if1つのステートメントのみを取り、中括弧は1つのステートメントをブロックします。

インデントによるスコープが必要な場合は、Pythonを使用してください。

コードの問題は、ステートメントが一致しない場合は何も返さないためif、未定義の動作が発生することです。あなたのコンパイラはおそらくそれについてあなたに警告を与えるでしょう。コンパイラの警告を無視しないでください。

コードの2番目のブロックは実際には必要なものでありelement、一致した場合にのみ変数を変更しますifが、常に変数を返しますelement

于 2013-03-25T05:04:50.803 に答える
2

return最初のケースでは、条件が満たされない場合、ステートメントを実行していません。おそらく、関数はガベージを返しています。

2番目のケースでは、中括弧がないため、条件に依存するのは1行だけです。returnステートメントは関係なく実行されます。つまり、2番目の例は次のようになります。

char uppercase ()
{
    //checks to see if "element"(char) is a lower-case letter between 'a' and 'z'
    if ((element >= 'a') && (element <= 'z'))
    {
        //changes value of "element" to be element + (value of A - Value of a)[-32]
        element += 'A' - 'a'; //element = element + -32
    }
    return element;
};
于 2013-03-25T05:08:34.097 に答える
0

ifステートメントがあります。ステートメントがtrueと評価された場合、その直後に操作が実行されます。一度に複数の操作を実行するには、それらを中括弧で囲む必要があります。

Jが大文字の場合、ifステートメントがfalseであり、中かっこをスキップし、戻り値が指定されていないため(したがって、意味のない戻り値)、中かっこで奇妙な答えが返されます。ifステートメント真でない場合に何を返すかを言う必要があります。

ifステートメントの後の最初の行だけがifによって制御されるため、2番目のコードは機能します。これは本質的にあなたがここで幸運であるということです-あなたがやりたかった2つの操作があったとしても、あなたはまだゴミを手に入れているでしょう。したがって、1つの操作であっても、ifステートメントで実行するコードを中括弧で囲んで明示的に指定することをお勧めします。

于 2013-03-25T05:08:04.143 に答える