[解決済み] この1988年のC言語のコードは何が問題なのでしょうか?
2023-02-12 21:37:40
質問
The C Programming Language" (K &; R)という本から、このコードをコンパイルしようとしています。これは、UNIX プログラムの基本的なバージョンです。
wc
:
#include <stdio.h>
#define IN 1; /* inside a word */
#define OUT 0; /* outside a word */
/* count lines, words and characters in input */
main()
{
int c, nl, nw, nc, state;
state = OUT;
nl = nw = nc = 0;
while ((c = getchar()) != EOF) {
++nc;
if (c == '\n')
++nl;
if (c == ' ' || c == '\n' || c == '\t')
state = OUT;
else if (state == OUT) {
state = IN;
++nw;
}
}
printf("%d %d %d\n", nl, nw, nc);
}
で、以下のようなエラーが出ています。
$ gcc wc.c
wc.c: In function ‘main’:
wc.c:18: error: ‘else’ without a previous ‘if’
wc.c:18: error: expected ‘)’ before ‘;’ token
この本の第2版は1988年のものですが、私はC言語についてはかなり初心者です。コンパイラのバージョンと関係があるのか、私がナンセンスなことを言っているだけなのかもしれません。
最近のC言語のコードでは、違う使い方の
main
関数の別の使い方を見ました。
int main()
{
/* code */
return 0;
}
これは新しい規格なのでしょうか、それともまだタイプレスメインを使うことができるのでしょうか?
どのように解決するのですか?
あなたの問題は、プリプロセッサーで定義された
IN
と
OUT
:
#define IN 1; /* inside a word */
#define OUT 0; /* outside a word */
これらのそれぞれに、末尾のセミコロンがあることに注意してください。プリプロセッサがこれらを展開すると、あなたのコードはおおよそ次のようになります。
if (c == ' ' || c == '\n' || c == '\t')
state = 0;; /* <--PROBLEM #1 */
else if (state == 0;) { /* <--PROBLEM #2 */
state = 1;;
この2つ目のセミコロンによって
else
を持たないことになります。
if
をマッチングさせることはできません。なぜなら、中括弧を使っていないからです。そこで、プリプロセッサの定義からセミコロンを削除して
IN
と
OUT
.
ここで得られた教訓は プリプロセッサー文はセミコロンで終わる必要はないということです。
また、中括弧は常に使用すべきです!
if (c == ' ' || c == '\n' || c == '\t') {
state = OUT;
} else if (state == OUT) {
state = IN;
++nw;
}
吊り下げはありません。
else
のようなあいまいさはありません。
関連
-
[解決済み】constで変数を初期化しようとすると「initializerの要素が定数でない」というエラーが発生する。
-
libc++abi.dylib: NSException タイプの捕捉されない例外で終了するエラー
-
[解決済み] 初期化でポインタ対象の型から修飾語を捨てる
-
[解決済み] flexible array member not at end of structエラーの原因は何ですか?
-
[解決済み] C言語のコードで「:-!」とは何ですか?
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] 配列のすべてのメンバーを同じ値で初期化するには?
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
-
[解決済み] 難読化Cコードコンテスト2006。sykes2.cの解説をお願いします。
-
[解決済み] while ( !feof (file) ) 」は、なぜいつも間違っているのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
libc++abi.dylib: NSException タイプの捕捉されない例外で終了するエラー
-
ポインタ定数および定数ポインタ
-
error: 'for' loop initial declaration is only allowed in C99 mode 原因と解決方法
-
[解決済み] C言語でchar配列をコピーする方法は?
-
[解決済み] ソケットアクセプト - "開かれているファイルが多すぎる"
-
[解決済み] C言語で配列のサイズを決定するにはどうすればよいですか?
-
[解決済み] C言語でファイルが存在するかどうかを確認する最も良い方法は何ですか?
-
[解決済み] ストラクチャーとユニオンの違い
-
[解決済み] 講師が書いたC言語のファイルは、なぜ最初の行に#が一つ付いているのですか?
-
[解決済み】Visual Studioで前処理をしたC/C++ソースファイルを見るにはどうしたらいいですか?