0

私は次のコードを使用しています(問題の根本を突き止めるために非常に単純化されています)。

#include <iostream>
namespace std;

int user;
int submit(int);

int main() {

    user = 1;
    submit(user);

    user = 2;
    submit(user);

    return(0);
}

int submit(int user) {

    if (user = 1) {
        printf("1");
    } else if (user = 2) {
        printf("2");
    }
    return(0);

}

これで「12」が出力されると思いましたが、代わりに「11」が表示されます。関数が2回呼び出される前に、変数「user」が再定義されていませんか?

ここで何が問題になっていますか?

4

3 に答える 3

8

の値を確認するの==ではなく、を使用してください。値を(with )で比較するのではなく、 (with)で上書きしています。=user===

于 2013-01-20T04:09:25.267 に答える
6

関数本体では使用して=いません。==

if (user = 1) { //This assigns user the value of 1 and then prints 1
         printf("1");

正しいテスト条件は次のとおりです。

if (user == 1) { //This checks the value of user and then prints if the condition is true
         printf("1");

コンパイル中に、を使用する場合gcc、オプションを追加する-Wallと、テスト条件での割り当てに関する警告が表示されるため、このような場合に役立ちます。

于 2013-01-20T04:10:23.287 に答える
1

専門家の回答によると、関数本体で使用する=代わりに使用==しているため、間違った出力が得られます。

ここで、なぜそれが起こるのかというあなたの概念を明らかにしたいと思います。代入演算子と等式演算子の違いを知っていただければ幸いです。そうでない場合は、簡単に説明します。

代入演算子(=):

代入演算子は、変数に値を代入します。例えば

user = 1;

このステートメントは、整数値1を変数に割り当てますuser

このステートメントは常に実行され、論理的にTRUEステートメントuserであることを示します(変数がすでに宣言されていると仮定します)。

比較などがないため、代入演算子(=)を条件として使用すると、常にTRUEまたは1

等式演算子(==):

等号演算子は、2つの値を比較して、それらが等しいかどうかを知るために使用されます。

user == 1;

userこのステートメントは、変数の値をと比較し、の値がそうでない場合はを返し1ます。TRUEuser1FALSE

結果:代入演算子は常に戻りTRUEますが、比較演算子はTRUEまたはを返す場合がありFALSEます。

コードに戻ります。

int submit(int user) {
//as you're using assignmnt operator this if condition will always true regardless of input
    if (user = 1) {    
       printf("1");
//because if condition is true, it will never go into else if condition
    } else if (user = 2) {
       printf("2");
    }
    return(0);
}

したがって、実際には、この関数を呼び出すたびに、この関数に渡され1た値に関係なく、毎回出力されます。userそれ以来、この関数を2回呼び出しました。したがって、印刷されます11

于 2016-12-30T17:03:45.613 に答える