🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

Q&A

解決済

4回答

1917閲覧

int型変数に'12'と代入した場合の動作について

kaina

総合スコア418

C

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

1グッド

3クリップ

投稿2019/10/24 02:51

前提・実現したいこと

会社の研修中にint型変数にシングルクォーテーションで囲った数字を
代入していた人がいたのですが、以下のワーニングが出るのみで、
コンパイルは通っておりました。

warning: multi-character character constant

このような使い方はしない認識ではありますが、
説明することが出来ませんでした。

出力結果については文字コードに対応した値が'1' = 0x31、'2' = 0x32であり、
その値がそのまま出力されているというのは分かるのですが、
そもそも、シングルクォーテーションで囲われた中に2文字以上の文字を
書くということは定義されている動作なのでしょうか?

該当のソースコード

C

1 int a = '12'; 2 printf("出力結果\n[%x]\n", a); 3 4出力結果 5[3132]

以上、宜しくお願いします。

kazuyakazuya👍を押しています

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

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

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

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

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

guest

回答4

0

ベストアンサー

そもそも、シングルクォーテーションで囲われた中に2文字以上の文字を

書くということは定義されている動作なのでしょうか?

はい、警告メッセージにあるように、multi-character character constantというものは存在します。型はintで、値は処理系依存とのことです(MSDN)。

[迷信] 一重引用符の中には一文字しか書けない

投稿2019/10/24 02:54

編集2019/10/24 03:02
maisumakun

総合スコア145973

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

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

maisumakun

2019/10/24 03:02

もっとも、値が「処理系依存」である以上、保証されているのは「int型の何かしらの値としてコンパイルできること」だけです。 挙動が明文化されている特定のコンパイラで使う前提ならともかく、そうでないなら書かないほうがいい部類のコードです。
kaina

2019/10/24 03:44

なるほど、どのような用途で使用するかは分かりませんが、処理系依存ではあるけどきちんと定義された動作なのですね。 非常に勉強になりました。
ttb

2019/10/29 01:11

処理系依存というのは、処理系によって動作を文書化するのが規定されているだけなのですよね。それなら、場合によっては、「動作不可」や「未定義と定める」と文書化されていれば、コンパイルエラーとなる可能性もあるのでは?と思いました。 解釈間違いならすみません。
maisumakun

2019/11/08 05:18 編集

> 場合によっては、「動作不可」や「未定義と定める」と文書化されていれば、コンパイルエラーとなる可能性もあるのでは?と思いました。 いえ、C言語の場合、「処理系定義の値」は「未規定の値」の一種であり、「適切な型の正しい値」で「トラップ表現となることはない」ことは保証されています。これに対して、「未定義」とある箇所は、そこに突っ込めば何が起きるかわからない世界です。
guest

0

既に明解な回答をいただいておりますので、sizeof('12')int型を示す、補間的回答です。

bash

1$ uname -a 2CYGWIN_NT-6.1-WOW turtle0 3.0.7(0.338/5/3) 2019-04-30 18:04 i686 Cygwin 3 4$ cat t1.c 5#include <stdio.h> 6 7int main(void) { 8 printf("sizeof(int)=%d\n", sizeof(int)); 9 printf("sizeof('12')=%d\n", sizeof('12')); 10 printf("sizeof('123')=%d\n", sizeof('123')); 11 return 0; 12} 13 14$ gcc -Wall t1.c 15t1.c: 関数 ‘main’ 内: 16t1.c:5:37: 警告: 複数文字からなる文字定数 [-Wmultichar] 17 printf("sizeof('12')=%d\n", sizeof('12')); 18 ^~~~ 19t1.c:6:38: 警告: 複数文字からなる文字定数 [-Wmultichar] 20 printf("sizeof('123')=%d\n", sizeof('123')); 21 ^~~~~ 22$ ./a.exe 23sizeof(int)=4 24sizeof('12')=4 25sizeof('123')=4 26 27$

投稿2019/10/24 03:13

dodox86

総合スコア9256

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

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

kaina

2019/10/24 04:03

int型である確認コードありがとうございます。 なるほど、処理系依存なので、int型のサイズ(まあほぼ4バイトでしょうが)によっては 格納出来る文字数が変わるわけですね。
guest

0

ちょっとアセンブル出力見てみました。即値(imm:イミディエイト)になってますね。

c

1#include <stdio.h> 2 3int main(void) 4{ 5 int a = '12'; 6 printf("出力結果\n[%x]\n", a); 7 // 8 return 0; 9}

asm

1main: # @main 2 .cfi_startproc 3# %bb.0: 4 pushq %rax 5 .cfi_def_cfa_offset 16 6 movl $.L.str, %edi 7 movl $12594, %esi # imm = 0x3132 8 xorl %eax, %eax 9 callq printf 10 xorl %eax, %eax 11 popq %rcx 12 .cfi_def_cfa_offset 8 13 retq

投稿2019/10/24 03:02

cateye

総合スコア6851

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

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

cateye

2019/10/24 03:04

環境は、Linux Mint + clang version 10
kaina

2019/10/24 03:52

ありがとうございます、アセンブラまで見る機会がないので、 参考になります。
guest

0

'x'というのは文字定数で、型はchar ですが、charってのは整数ですよ
そもそもC言語には、文字の型とか文字列てのはありません

投稿2019/10/24 02:58

y_waiwai

総合スコア88038

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

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

thkana

2019/10/24 03:48

Cでは' 'で囲んだ文字リテラルはint型です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問