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

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

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

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1599閲覧

C while 条件式を配列にしてインクリメントすると終了するのはなぜなのか。

ackubo

総合スコア2

C

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/05/22 08:15

編集2021/05/22 10:19

コード内容 

while (*str)
{

str++; }

終了条件について

()内条件を満たさない場合。

int i =3;
while(i)
{
i--;
}
上記でi=0で終了するのは知っているのですがchar型配列をインクリメントしていくループが終了しているコードを見つけたのでどういった動作をしているのか教えていただきたいです。

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

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

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

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

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

angel_p_57

2021/05/22 08:27

str の指す内容が明らかでないので、補足してください。
ackubo

2021/05/22 08:32

質問本文へ追記しましたが、文字配列です。
episteme

2021/05/22 09:27

これ C# の質問?
ackubo

2021/05/22 10:18

Cの話なので間違えていました。修正しておきます。
guest

回答2

0

ベストアンサー

一応想定で、str が「文字列(としての文字配列)」由来のポインタとしますが、C では、{ 'a', 'b', 'c', 0 } というような、終端に NUL文字 ( コード 0 ) が来る配列を文字列として扱います。
※ char string[]="abc"; のように初期化すると自動的に NUL 文字を付加して扱ってくれますが、自分でデータを変更するときは、終端にNULがある状態を保っているか気を付ける必要があります。

次に、char string[]="abc"; char *str = string; のように配列を操作するためのポインタにおいては、str++ や str+=1 のように 1 をポインタを加算すると「次の要素(文字)を指すポインタ」に更新されます。
そのため、str++ を繰り返すことは、文字列中1文字ずつ指す位置をズラしていく操作になります。
するといつかは終端の NUL文字の位置を指すことになりますので、*str が 0 ということで、while文の終了条件を満たします。

投稿2021/05/22 08:35

angel_p_57

総合スコア1672

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

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

ackubo

2021/05/22 08:48

!= 終端文字 で今まで行っていたので、こちらの方法の方が全文字を対象にするなら良い記述ですね。ありがとうございます1
guest

0

*str が0になるから。

投稿2021/05/22 08:27

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ackubo

2021/05/22 08:29

終端文字までいくと0になる、という理解であっていますか?
退会済みユーザー

退会済みユーザー

2021/05/22 08:36 編集

違います。 終端文字を0にしないように作ることも出来るけれど、終端文字を0にする。と言うのがC言語(string.hで定義されている関数群)の決まりです。
ackubo

2021/05/22 08:49

そういうルールがあるのでインクリメントし続けるとループが終わるということですね。回答ありがとうございました。
退会済みユーザー

退会済みユーザー

2021/05/22 08:54

そのルールは全てのC言語のプログラムに当てはまるわけではないので、そのサンプルコードはある意味間違いです。
退会済みユーザー

退会済みユーザー

2021/05/22 08:57

string.h を使わなくてはいけないと言うルールはないので。
退会済みユーザー

退会済みユーザー

2021/05/22 09:06

string.h を使ったとしても文字列の長さが決まっている場合は、NULLを区切り文字として使用せず、memcmp, memcpyで処理することもあります。 なのでやっぱりそのサンプルコードは間違いです。
退会済みユーザー

退会済みユーザー

2021/05/22 09:15

今でもマイコンの通信データの場合データ長が64byte等と決まっている場合があります。そのたったの64byteのデータ長に必要な通信データを詰め込みたい場合はNULL終端文字の1byteが余計です。 むしろ今どきC言語を使用するのはマイコンのような低スペックなコンピュータに限られるため、NULL終端文字が常識だと思わない方がいいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問