2

K&R の The C Programming Language でいくつかの例に取り組んできましたが、if ステートメントと else ステートメントを切り替えた演習 1-12 で行ったテストでちょっと混乱しています。

質問は次のようになります: 入力を 1 行に 1 語出力するプログラムを作成してください。

基本的に、単語間の複数のスペースを無視しながら \n をテストするために、最初にこれを書きました。

#include <stdio.h>

int main()
{
    int c;

    while ((c = getchar()) != EOF) {
        if (c == ' ' || c == '\t') {
            printf("\n");

        }
        else {
            putchar(c);
        }

    }
}

この例では、空白またはタブを検出すると新しい段落を出力し、そうでない場合は入力を正確にコピーします。

このコードは、私が望んでいた結果を生成しました (入力の単語間に余分なスペースがあるため、まだ余分な段落がありますが、今のところ無視しています)

そこで、条件を変えながらif文とelse文を入れ替えたらどうなるか見てみようと思ったのですが、結果は同じではありません。

#include <stdio.h>

int main()
{
    int c;

    while ((c = getchar()) != EOF) {
        if (c != ' ' || c != '\t') {
            putchar(c);
        }
        else {
            printf("\n");
        }

    }

}

この例では、空白やタブではないものをすべて印刷したいと考えていました。そうでない場合は、新しい段落が作成されます。

新しい条件でも同じ結果が得られると思っていました。代わりに、入力したものをコピーしただけです。これが機能しない理由を誰かが知っていますか?

4

2 に答える 2

9
    if (c != ' ' || c != '\t') {

この条件は、スペースではない、タブではない を確認します。スペースとタブの両方を同時に使用することはできないため、これは常に当てはまります。試す:c cc

    if (c != ' ' && c != '\t') {

この原理については、ド・モルガンの法則で詳しく読むことができます。

別のアプローチでは、コンパイラーに論理否定を実行させることができます。

    if (!(c == ' ' || c == '\t')) {

!ただし、一部の人(私を含む)は、余分な括弧と左側の小さいために、読みにくいと考えるでしょう。

于 2012-08-16T21:57:38.070 に答える
2

の反対:

if (c == ' ' || c == '\t') {

(パラメーターcはスペースまたはタブのいずれかです)

は:

if (c != ' ' && c != '\t') {

(パラメーターcはスペースでもタブでもありません)

に変更する||必要があります&&

于 2012-08-16T21:58:02.790 に答える