- ベストアンサー
X='A'とX="A"の違いは
Cの初心者です、宜しくお願いします。 X='A'とX="A"の意味を教えてください。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
No.2です。 No.5も回答がありますので補足程度に。 >文字コードをだす場合と、変数内の文字を打たす場合の書き方が分かりません。 「文字」「文字列」と関連して「出力書式」についても勉強が必要です。「%c」や「%d」等の「c」や「d」の部分です。 以下に一部を簡単に c:指定されたアドレス(変数)の内容を文字として出力する d:指定されたアドレス(変数)の内容を10進数の数値として出力する s:指定されたアドレス(変数)を先頭として「\0(NULL文字)」が検出されるまで内容を文字として出力し続ける。 です。 従って、 >YY='A'としたときに、Aのコードを知りたいときには、print(”%c”、YY);とするのでしょうか。 こちらは問題ありませんが >また、Aという文字を印字させたいときは、print(”%s”、YY);とするのでしょうか。 は「運が良ければ」意味不明な文字の羅列がある程度表示されるだけで終わり、運が悪ければ「保護エラー」で終了です。
その他の回答 (6)
- Wr5
- ベストアンサー率53% (2173/4061)
「文字」と「文字列」について、もっと勉強した方がよさそうです。 >X[]="abc"としたときに、X[1]を知りたいときには、print(”%s”、X[1]);とするのでしょうか。 printf("%c", X[1]); でも printf("%d", X[1]); でも printf("%x", X[1]); でもお好きなように。 >YY='A'としたときに、Aのコードを知りたいときには、print(”%c”、YY);とするのでしょうか。 こちらは問題ありませんが、 >また、Aという文字を印字させたいときは、print(”%s”、YY);とするのでしょうか。 は一般保護違反などで止まる(落ちる。吹っ飛ぶともいう)でしょう。 変数YYの型が不明ですが、「YYに入っている値を文字列の先頭を指しているポインタ」として解釈しますので…。 # ところでprint()ではなくprintf()では? >この両者の違いとそれぞれ意味するところ、使い方がさっぱり分かりません。 #1で回答ついているとおり、'.'は「文字」です。 char型の変数1つに格納可能です。 "."では「文字列」です。 char型の変数1つでは格納できません。 また、文字列リラテルではすでに何度も書かれている通り先頭アドレスとして扱われます。 よって… while( ch1 != "."){ } だと、ch1に入っている値とどこかに確保された"."の先頭アドレス('.','\0'と連続するデータの'.'が格納されたアドレス)との比較になります。 よって、ch1がポインタでない限りこの判定式は常に真となりますので、 このループから抜けることはありません。 # ch1がint型やchar型の変数なら、おそらくコンパイラから警告が出るでしょう。 # ch1がC+などのstringクラスなどの場合には、上記のような表記が可能な場合もありますが。
- SilverThaw
- ベストアンサー率32% (260/806)
No.2です。 すでに回等がありますので、補足程度に。 > この両者の違いとそれぞれ意味するところ、使い方がさっぱり分かりません。 端的に説明すると 「(半角/8bit)1文字」を表すときに「'」(シングルクォーテーション)「文字列」を表すときに「"」(ダブルクォーテーション) を使用します。 「A」という「文字」を表す場合には'A'、「ABC」という「文字列」を表す場合には"ABC"という形で使用します。 char a = 'A'; // 1文字を格納する変数 char b[10] = "ABC"; // 文字の配列(文字列格納の変数) ここで気をつけてほしいのは、'A'と"A"は意味が違うということです。 'A'は「A」という1文字ですが、"A"は実際には「A \0(NULL文字)」という「2文字」で構成されているということです。 C言語は、基本的に配列を等号/不等号で判断することができません。 従って、「while( ch1 != "."){ }」と記載した場合には、コンパイル時にエラーとなるはずです。 ちなみに、以下のコードは全て同じ動作をします。 while( ch1 != '.' ){ } while( ch1 != 0x2E ){ } while( ch1 != 46 ){ } 1番目は質問のコード、下二つは「ピリオドを現す文字コード」をそれぞれ16/10進数で記載したものです。 C言語の基本は数値(データ)です。そのデータがどんな意味を持っているかという意味で「'」は「1文字の文字データ」を、「"」は「複数の連続した文字データ」という意味で使います。
- Lchan0211
- ベストアンサー率64% (239/371)
まず、記号の呼び方について、 「.」は、「ピリオド」または「ドット」と呼びます。 「,」は、カンマと呼びます。 で、 '.'は、ピリオド文字を表わします。 ピリオド文字=ピリオドの文字コードです。 文字は、char型です。 char型は8ビットなので1文字しか表現できませんが、 その8ビットの文字の集合を文字列と呼び、 "abc"といったダブルクオーテーションで囲んで表現します。 "abc"で表現された文字列の型は、char型ではなく、 char *型(charへのポインタ)になります。 この"abc"は、'a','b','c','\0'という4つの文字が 並んだ文字領域の先頭アドレスを表わします。 また、"a"は、'a'と'\0'の2つの文字が並んだ文字領域の 先頭アドレスを表わし、これを1文字の文字列と呼びます。 ('\0'は、文字列の終わりを表わす文字なので、文字数に 数えません。) ちなみに、""という表現も可能で、これは '\0'だけの文字領域のアドレスを表わします。 これは、文字数0の文字列です。
- toda hiro(@hiro_knigh)
- ベストアンサー率39% (59/151)
お疲れ様です。 もし、何かの本を読まれていて、それでも分からないという事であれば、その本のタイトルをお教えお願い出来ないでしょうか? 他の人にも勧めない本として記憶します。 で、違いについては参照URLを参照の事。 Web上にはあまり良い情報が無かったですが、参照URLに記載したのが一番わかりやすかったかな?と
- SilverThaw
- ベストアンサー率32% (260/806)
>「while( ch1 != '.'){ }」と言う場合の「'.'」は、どのような意味でしょうか。 whileの条件式の意味は「ch1の内容が「.」(ピリオド)でない間ループする」です。 つまり、どこかでch1に何らかの値が入力(格納)され、その内容が「.」になるまでループします。 この処理では都合上「.」を使っているのであって、処理的には別に「1」でも「a」でも一緒で特別の意味は持っていません。
お礼
SilverThawさん、回答有り難うございます。 >( ch1 != '.')の意味は「ch1の内容が「.」(ピリオド)でない間ループする」です。 # ピリオドなら、「.(カンマ)」はchar型なので、「”.”」とダブルコーテーションで囲ってやるべきなのではないでしょうか。 「'.'(シングルコーテーション)」と「.(カンマ)の文字コード」にわざわざする意味はあるのでしょうか。 この両者の違いとそれぞれ意味するところ、使い方がさっぱり分かりません。
- okg00
- ベストアンサー率39% (1322/3338)
X='A' ↓ Xに「A」の文字コードを代入する X="A" ↓ Xに「A」という文字列(文字リテラル)のアドレスを代入する。 なお、Xに入力されたアドレスには「A」の文字コード、その次のアドレスには「'\0'」が格納されている。 文字と文字列の違いです。
お礼
okg00さん、回答有り難うございます。 「while( ch1 != '.'){ }」と言う場合の「'.'」は、どのような意味でしょうか。
補足
>Xに「A」という文字列(文字リテラル)のアドレスを代入する。 なお、Xに入力されたアドレスには「A」の文字コード、その次のアドレスには「'\0'」が格納されている。 このXのアドレスと、その次のアドレスの「'\0'」をどのように確認したら言いのでしょうか。
お礼
SilverThawさん、ありがとうございます。 X[]="abc"としたときに、X[1]を知りたいときには、print(”%s”、X[1]);とするのでしょうか。 YY='A'としたときに、Aのコードを知りたいときには、print(”%c”、YY);とするのでしょうか。 また、Aという文字を印字させたいときは、print(”%s”、YY);とするのでしょうか。 文字コードをだす場合と、変数内の文字を打たす場合の書き方が分かりません。 宜しくお願いします。