2017-02-17 10 views
0

次のCコードの抜粋を考えてみましょう。奇妙な条件のチェック

while(!var_can_be_0_or_1 && foo_returns_0_or_1(arg1, arg2)) { 
    body; 
} 

私が理解していないことは簡単な状態文です。しかし、のは、私は2つのマクロ

#define TRUE 1 
#define FALSE 0 

を持っているとしましょう誰かが我々がここでこのwhileループ条件でチェックしているかを教えて(というか私に説明)していただけますか?私は、ループボディがどのような条件で実行され、どの条件でスキップするのかを意味していますか?

推敲

私はPostfix一つに中置式の文字列を変換するプログラム内のデータ構造についての本でそれを発見しました。正確なコードは次のようなものでした--->

int prcd(char char); 
int und, outpos; 
char symb, topsymb; 

while(!und && prcd(topsymb, symb)) { <----- Stuck on this one real bad 
      postr[outpos++] = topsymb; 
      popandtest(&opstk, &topsymb, &und); 
} 

おそらく、詳細は文脈に入れる必要はありません。 ;)

EDIT:

質問が支援しようとしている人々に、やや不明であった場合、私は本当に申し訳ありませんが、私は、私は本当にここ

を求めていますかについてもう少し説明します

のは、私はこのテキストの精巧な部分に書いたコードを忘れて、最初の1に戻って、ちょうど私たちはwhileループ、無地でシンプルな持って言わせてみましょうしばらくここでループ

while(!condition1 && condition2) { 
execute some codes; 
} 

、= の場合、undは0または1のいずれかの値を持つintです(そして何も指定しないでください)。 0と1はそれぞれFALSETRUEにマクロ化されています。そして、condition2 = prcd(topsymb, symb);プロトタイプがint prcd(char char);と記載されている関数です。再び、0または1と何も返されません。

ここで私が知りたいのは、です。ループ内の条件が評価されます。

これは物事をクリアします。私が意味する:)

+0

「私が知りたいのは、whileループの括弧内の状態がどのように評価されるかです。これが問題を解決することを願っている」 - いいえ、物事を明確にしていない。答えは以前と同じです。条件が満たされている場合にのみ、whileループ内のすべてが「評価」されます。 –

+1

@SaniSinghHuttunen私の親愛なる先生、もちろんあなたの答えは変わりません。私は単に質問を理解するのに苦労している人々のためにいくつかの編集をしました。しかし、あなたは私が最初に求めていたことを正確に知っていました。 Thanks again again :) – allocated

+0

condition1とcondition2が1,0または1,1の場合、condition1のみが評価され、ループは実行されません。 0,0 - 両方の条件が評価されますが、ループは実行されません。 0,1 - 両方の条件が評価され、ループが実行されます。 – Dmitri

答えて

4

/ループ本体が実行されますよと 条件/ sの、それがvar_can_be_0_or_1false(すなわち0)とリターンの場合

bodyが実行されるスキップされますどのような条件でfoo_returns_0_or_1の値はtrueです(つまり、0ではありません)。

いずれかの基準が満たされない場合、bodyはスキップされます。

+2

... 'foo_returns_0_or_1()'は 'var_can_be_0_or_1'がゼロでない場合には呼び出されないことに注意することも重要です。 – Dmitri

+1

@Dmitri:問題には関係しませんが正解です。 –

+0

ありがとう@Sani Sutu Huttunen、まさに私が探していた答え:) – allocated

1

&&オペレータは、左から右の評価を強制します。 !var_can_be_0_or_1は完全に評価されます(そして、副作用が適用されます)。式の結果がゼロでない(true)場合、foo_returns_0_or_1(arg1, arg2)が評価されます。その式の結果も非ゼロ(真)であれば、ループの本体が実行され、そうでなければループは終了します。

2

これはあなたが探しているものであるが、ここで私はあなたが望む信じるものであれば、私はわからないよ:

while(!var_can_be_0_or_1 && // if this is '0', continue; else exit 
     foo_returns_0_or_1(a, b) // if this is NOT '0', continue; else exit 

は、このヘルプをしていますか?あなたのマクロを使用して

が、これは、機能foo_returns_0_or_1は1を返しますが、代わりに他のいくつかの番号を返していない場合は、あなたの本当のマクロが一致しません、ので、私は同様の言う

while (var_can_be_0_or_1 == FALSE && foo_returns_0_or_1 == TRUE) 

を書くことに似ています上記のように条件テストは失敗します。

Cでは、等価(== TRUE)を書く必要はなく、関数の出力や変数の状態(intの場合)で評価することができ、このステートメントのより良い選択です。

@ John Bodeが指摘するように、最初の条件が失敗した場合、2番目の条件は決してテストされません。これは関数なので、関数が決して呼び出されない可能性があります。

+0

これには?が含まれていますか?私はいいえと言います。 –

+0

私はあなたのコメントを理解していません。あなたは精緻化できますか? – tjcertified

+0

私は 'x == TRUE'のようなものをC言語で見たときにひどいです...' x == TRUE'が真でないと評価することはできません( 'x'は0にしかならない時ではないまたは1)。 – Dmitri

0

これは、それがそのままコンパイルされないため、これは事前条件がない疑似コードだと思います。

  1. 「ウント」がグローバルである場合、それはゼロに初期化する必要があり、それがスタックに割り当てられ、したがって、動作が予測不能であるため、関数の内部で、これはごみで初期化しなければならない場合、whileループは常に、TRUEであろう。
  2. 同様に、prcd()の定義が不足しているため、返される内容を示唆することは困難です。

適切な入力で質問を修正する必要があると思います。

+0

申し訳ありませんが、私の質問は最初は不明だったと思います。私はそれを編集します。 – allocated