0

これは、私が問題を抱えているコードのセクションの非常に単純化されたバージョンです。

int i = 0;
int count = 0;
int time = 50;
int steps = 1000;
double Tol = 0.1;
bool crossRes = false;
bool doNext = true;

for (int i=0; i<steps; i++) {

//a lot of operations are done here, I will leave out the details, the only
//important things are that "dif" is calculated each time and doNext either
//stays true or is switched to false

    if (doNext = true) {
        if (dif <= Tol) count++;
        if (count >= time) {
            i = steps+1;
            crossRes = true;
        }
    }
}

    if (crossRes = true) {
        printf("Nothing in this loop should happen if dif is always > Tol 
               because count should never increment in that case, right?");
    }

私の問題は、 for ループで完了するたびに、カウントがインクリメントされなくても、「if (crossRes = true)」ブラケット内のステートメントを実行することです。

4

5 に答える 5

5

あなたはよくある (そしてかなりイライラする) 間違いを犯しました:

if (crossRes = true) {

この行は に割り当てcrossRestrueを返しますtrueと比較 しようとcrossResしています。trueつまり、別の等号が必要です。

if (crossRes == true) {

またはより簡潔に:

if (crossRes) {
于 2012-07-30T21:24:48.213 に答える
2

私は訂正します:

if (crossRes)
条件が if (true = crossRes) の場合、コンパイルされないため、この問題は発生しません。crossRes = true は true への代入なので、常に true と評価されます。`crossRes == true` が必要です: if (crossRes == true) { printf("dif が常に > Tol の場合、このループでは何も起こらないはずです。その場合、count はインクリメントされないからですよね?"); }
于 2012-07-30T21:23:33.953 に答える
1

ここでの他の回答はあなたに問題を伝えました。多くの場合、コンパイラは警告しますが、これを行わないようにする方法は、定数項を左側に置くことです

 true == crossRes

そうすれば、警告の代わりにコンパイラエラーが発生するため、見過ごされることはありません。

 true = crossRes

コンパイルしません。

于 2012-07-30T21:27:38.557 に答える
1

=は代入、==は等価比較です。あなたがしたい:

if (crossRes == true) {

ここで同じ間違いを犯します:

if (doNext = true) { // Bad code
于 2012-07-30T21:23:46.410 に答える
1

まず、多くの人が の問題を指摘していますがif (crossRes = true)、何らかの理由で (まだとにかく) の同じ問題を指摘していませんif (doNext = true)

if (crossRes)ではなくif (crossRes == true)(または)が本当に欲しいことを指摘することに固執しますif (true == crossRes)

1 つ目の理由は、単純なタイプミスで同じ問題が発生するのを回避するためです。

2 つ目は、比較の結果がbool-- であるということです。したがって、if (crossRes==true)必要に応じて、おそらくif (((((crossRes == true) == true) == true) == true)確認する必要があります (さらにいくつか -- わからない場合もあります)。もちろん、これはまったくばかげています。 から始めているboolので、 を取得するのに比較は必要ありませんbool

また、記録のために、比較を行うことを主張する場合は、ほとんどの場合if (x != false)ではなくif (x == true). C++ では実際には適用されませんが、実際のブール型を持たない古い C では、任意の整数型を使用できますが、この場合、 との比較でtrue誤った結果が得られる可能性があります。少なくとも通常はfalse0 とtrue1 になりますが、テストすると、ゼロ以外の値は と同等と見なされtrueます。例えば:

int x = 10;

if (x)    // taken

if (x == true) // not taken, but should be.

ここにいるようにブール値から始めていない場合は、if (<constant> <comparison> <variable>) 意味があり、(IMO) が優先されます。ただし、とにかくブール値から始める場合は、それを使用してください。比較して同じものを作成しないでください。

于 2012-07-30T21:33:20.797 に答える