dポイントプレゼントキャンペーン実施中!

#include <stdio.h>
int main(void) {
char str[] = "0123456789";
printf("%d\n", str[2] + str[4]);
}
なぜ、配列の書き方が char str[] = "0123456789"の場合は
str[2] + str[4]の足し算が50+52で102と10進数で出るのでしょうか?
そういうルールなのでしょうか?
てっきり答えは6と思っていました。

また、
#include <stdio.h>int main(void) {
char str[] = { 1,2,3,4,5 };
printf("%d\n", str[1] + str[3]);
}
の char str[] = { 1,2,3,4,5 }; とした場合は6と出ます。

char str[] = "0123456789";とchar str[] = { 1,2,3,4,5 };は同じ書き方だと思っていましたが、その文字列を扱う変数によっては、例えば配列などによっては扱いが違うと今更ながらわかりました。

A 回答 (4件)

#2です。



#2のお礼に対して
>0.はただの数値
これは正解。

>'0'は0とい値
>"0"は0という文字
この二つは違う。

この点はC言語で文字を扱う際に最も重要な点です。しっかりとここで身に着けるように。

'0'とシングルクォーテーションで挟み込んだ文字は文字リテラルと呼ばれ、間に挟み込まれた1文字を示すコードになります。
'0'はASCIIコードだと0x30という数値になります。

"0"とダブルクォーテーションで挟み込んだ文字(列)は文字列リテラルと呼ばれ、char型の定数配列として扱われます。
""の間のものは文字として取り扱われ、この配列は'\0'で終端されます。
"0"と同じ要素を持つ配列は{'0','\0'}です。

上記のことを参考に質問の二つの宣言の違いを見てみましょう。
char str[]="0123456789";
は文字配列strを文字列リテラル"0123456789"の中身で初期化しています。
この文字列リテラルは11文字から構成されていますので、要素数11の配列として初期化されます。
その構成要素は{'0','1','2','3','4','5','6','7','8','9','\0'}です。(ここでのシングルクォーテーション(')を省略してはいけません)

char str[]={0,1,2,3,4,5};
は文字配列strを数字の0,1,2,3,4,5を要素として持ちます。''で囲んでいないので単なる数値です。
文字も所詮は数字で表されているのでchar型に数字を代入することも可能なのです。まともな文字にコードされるとは限りません。バックスペース(BS)やエスケープ(ESC)になるかもしれません。
    • good
    • 0

ASCIIコード表を参照ください。


https://www.k-cube.co.jp/wakaba/server/ascii_cod …

char str[] = "0123456789";
又は
char str[] = { '0','1','2','3','4','5','6','7','8','9','\0'};
としたときの、"0123456789"の値は、
10進数では48~57になります。
つまり
char str[] = "0123456789";

char str[] = { '0','1','2','3','4','5','6','7','8','9','\0'};

char str[] = { 48,49,50,51,52,53,54,55,56,57,0};
は全て同じことになります。
「#include <stdio.h> i」の回答画像3
    • good
    • 0

根本的なところで間違っている。



0と'0'と"0"の違いが判りますか。
    • good
    • 4
この回答へのお礼

0.はただの数値
'0'は0とい値
"0"は0という文字

お礼日時:2021/02/22 13:24

>そういうルールなのでしょうか?


そうです。

>同じ書き方
同じにするなら、こんな感じ:
char str[] = "0123456789";
char str[] = { '0','1','2','3','4','5','6','7','8','9','\0'};

変数strは、char型の配列です。扱い方も前者と後者で変わりありません。
    • good
    • 2

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!