質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

565閲覧

If文における条件式の処理内容を教えてください

TeraTera

総合スコア3

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2023/02/01 06:27

編集2023/02/01 07:01

実現したいこと

擬似catコマンドをc言語で記述する

前提

現在、c言語を学習しており、catコマンドをc言語を用いて作ってみる、という課題を行なっています。

発生している問題・エラーメッセージ

下記にソースコード全文を掲載しましたが、以下の部分が質問の該当箇所となります

else { while((c = fgetc(f)) != EOF) { if(putchar(c) < 0) exit(1); } }

これは、条件式の中でputchar(c)を実行して、負数でなければその関数を実行するという処理を、if文の条件式の中だけで完結させているという認識で合っているのでしょうか?
今までの経験だと、条件式の後に必ず処理内容が入っていたので、条件式だけで処理を完結させていることに違和感があり、質問させて頂きました。

該当のソースコード

#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int i; int c; FILE *f; for(i = 1; i < argc; i++) { f = fopen(argv[i],"r"); if(!f) { perror(argv[i]); exit(1); } else { while((c = fgetc(f)) != EOF) { if(putchar(c) < 0) exit(1); } } exit(0); } }
C言語

試したこと

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1T2R3M4

2023/02/01 06:36

exit(1); 自分で作っていて なぜそのような疑問が出てくるのか理解できないですが。
TeraTera

2023/02/01 06:42

課題は、「ふつうのLinuxプログラミング 第2版 Linuxの仕組みから学べるgccプログラミングの王道 」という本の中で出ており、上記のコードは回答をほぼまるパクりで作ったものです。 厳密に言えば、自分で作ったとは言えませんが。
jimbe

2023/02/01 06:49

コードのマークダウン(```) で囲むのはコードのみとし、説明等は ``` の囲みの外に書いてください。
TeraTera

2023/02/01 06:51

おお、すみません初心者で。 次回以降そうします
jimbe

2023/02/01 06:55

質問は編集出来ます。
TeraTera

2023/02/01 07:01

できました〜
Zuishin

2023/02/01 07:19

複文は複数の文からなる文です。 複数の文をまとめるには {} を使います。このブレースの間に並べた文が複文という一つの文として扱われます。 if (条件) { 実行されるコード } という書き方をした場合、「実行されるコード」が何行であってもブレースによって一つの文にまとめられます。 if の文法は if (条件) { 実行されるコード } ではなく、「if (条件) 文」です。つまりブレースは必要ありません。 実行されるコードが複数の文から成る場合はブレースを使って一つの複文にまとめますが、単文であった場合はブレースを使わずそのまま書くことができます。
jimbe

2023/02/01 08:18

編集ありがとうございます。
guest

回答2

0

ベストアンサー

これは、条件式の中でputchar(c)を実行して、負数でなければその関数を実行するという処理を、if文の条件式の中だけで完結させているという認識で合っているのでしょうか?

putchar(c)を実行し、結果が負数であれば、exit(1)を実行します。

投稿2023/02/01 06:47

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TeraTera

2023/02/01 07:03

ありがとうございます!つまり、 if(putchar(c) < 0) exit(1); if()の中の条件式で、putchar(c)を実際に実行している、と言うことですよね? 今まで条件式、その後に正と偽の処理内容を記載するというのが一セットの流れだったので、if文の条件式の中で何らかの処理を行うことに違和感があったのですが、そういう使い方もできる、ということですかね。
ozwk

2023/02/01 07:16 編集

はい。if()の中の条件式で、putchar(c)を実際に実行しています。 > 処理を行うことに違和感 そもそもif文の「条件式」というのは0かそうでないかしか見ていません。 例えば if(x>0) というのは x>0 を処理した結果、1か0になって、それで判断しています。
TeraTera

2023/02/01 07:19

なるほどー!!端的かつ的確なご回答ありがとうございます!!
jimbe

2023/02/01 17:10

while のカッコの中と/も同じですね。
guest

0

違います。putcharの仕様を確認してください。
端的に言えば、putcharは引数の値を"1文字"表示する関数です。
この関数を失敗した際に戻り値が-1なので0と比較しています。
失敗したので終了処理に向かっているということになります。

投稿2023/02/01 06:41

ardin

総合スコア544

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TeraTera

2023/02/01 07:14 編集

そこは理解していると思っています。 成功すればint型でASCII値を返し、失敗した場合には負数を返すというとことですよね。 それを0と比較していると。 私が理解していないのは、条件文の中に記載された、putchar(c) < 0が、なぜ実際に実行されているか (条件文の中に記載された関数が、なぜ後続の処理内容もなく実行されているか)という部分です。 負数が返ってくれば、exit(1)で終了処理はわかります。 ですが、それが偽の場合の処理内容は、記載されていませんよね。 だから、if文の中の条件式で記載されたputchar(c)が、そのまま実行されているのかな、と思ったのです。(分かりづらくすみません)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問