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

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

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

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

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Q&A

2回答

862閲覧

char型とint型に関して。またstr[]の中身に関して。

carnage0216

総合スコア194

C

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

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

0グッド

0クリップ

投稿2021/07/29 07:01

編集2021/07/29 07:19

なぜ文字を扱うchar型のqはint型のchにqの中身の文字を代入出来るのですか? int型のchに代入する事で文字、すなわち文字コードが代入する側の値を扱うint方により文字は文字コードを表す値になるため、画像のようにch=*qとおけたのでしょうか? 個人的には型が同じでないと代入できないため、なぜch=*qと書けたのかよくわかりません。

プログラムです。

#include <stdio.h> #include <string.h> int main(void) { char str[] = "str == NULL ? \"(NULL)\" : str"; char* p, * q; int ch; p = str; for (;;) { for (q = p; !(*q == '?' || *q == ':' || *q == 0); q++); ch = *q; *q = 0; printf("|%s|\n", p); if (ch == 0) break; p = q + 1; } }

charなどの型のない* qは一文字の数字や文字を扱います。
こちらの画像は私の推論です。

もう一つ、疑問があるのですが、なぜforの二周目以降のデバッグでのstr[]の中身はstr == NULLであるのに、一週目のstr[]の中身はstr == NULL ? "(NULL)" : strであるかについてです。
過去にforの一週目のカッコの中身、すなわち(q = p; !(*q == '?' || *q == ':' || *q == 0); q++)のq++は働かないと聞きました。q++が働かなったためにqには0や値すらも入らないためp = q + 1;が動かず、一週目のstr[]の中身はstr == NULL ? "(NULL)" : strなのかなと考えてみたのですが、正しいでしょうか。

編集
cahr型は文字や文字列、文字としての数字や数字の列を表す文字コードなどを数値として扱い、
char* pは文字や文字列や文字としての数字や数字の列の先頭のアドレスを数値として扱い、
*qは一つの文字や文字としての数字を文字コードなどを数値として扱う。そのため、整数などの値を扱うint型のchに数値として渡せるため ch = *q;と出来たのでしょうか?

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

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

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

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

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

m.ts10806

2021/07/29 07:09 編集

型のこと理解できてたらこんな質問にはならんのでは。 Cは分からないけど、基礎部分がごっそりないまま押し通してることが分かる。 そりゃデバッグしてもわかりませんよ。デバッグは基礎ができてる前提で効果が現れる。
退会済みユーザー

退会済みユーザー

2021/07/29 07:14

{}は配列 ""は文字列
fana

2021/07/29 07:20

そのコードを書いた人(わざわざ int ch; とかいう謎の型選択を行った者)に尋ねてください.
episteme

2021/07/29 07:55 編集

回答は回答欄へ(それが回答なら) > yukkuri_reimu
fana

2021/07/29 07:38

Considering your current ability, this code is too difficult for you. Therefore, I recommend to forget this code and to train with other simpler code. This is really serious advice.
guest

回答2

0

個人的には型が同じでないと代入できないため

あなたの都合は関係ありません。コンパイラは、コンパイラの論理で動いています(幅の広い整数型への変換は自動で行われます)。

投稿2021/07/29 07:10

maisumakun

総合スコア145184

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

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

0

C言語においては、文字型という型は存在しません
charってのはあくまで1バイト幅の整数です

そして、文字列、と呼ばれるものは、char(1バイト整数)の配列でしかありません。

投稿2021/07/29 07:06

編集2021/07/29 07:07
y_waiwai

総合スコア87774

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

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

kazuma-s

2021/07/29 07:32

規格書に「文字型」の記述があるのに、 「文字型という型は存在しません」とはどういうことですか? JIS X3010:2003 (ISO/IEC 9899:1999) 6.2.5 型 オブジェクトに格納した値又は関数の返す値の意味は,それをアクセス するのに使われる式の型(type)によって決定する。 ...  三つの型 char,signed char 及び unsigned char を総称して文字型(character type)と呼ぶ。処理系は,char を,signed char 又は unsigned char のいずれか と同じ値の範囲,同じ表現形式,そして同じ動作をするものとして定義しなければ ならない。
y_waiwai

2021/07/29 07:45

たんに1バイト整数型に文字型という名前をつけた、ってだけですね。
otn

2021/07/29 08:00

「他の言語にあるような文字型は存在しません」かな。 ただ、それを他の言語を知らない人に言ってもしょうがないですが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問