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

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

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

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

Q&A

解決済

5回答

88965閲覧

c言語のbool型変数の出力変換指定子

Takahito_Ogawa

総合スコア229

C

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

0グッド

0クリップ

投稿2015/06/07 09:53

c言語のbool型についての質問です。
printf関数でbool型変数の値を表示したい場合は、int型のときと同様に%dでいいのでしょうか?
それとも、bool変数用の指定子が新たに用意されているのでしょうか?

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

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

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

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

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

guest

回答5

0

ベストアンサー

printf関数でbool型変数の値を表示したい場合は、int型のときと同様に%dでいいのでしょうか?

真値で1/偽値で0を表示するならば、int型と同じく%d指定子でOKです。
"true"/"false"のような表記が欲しければ、%s指定子と(b ? "true" : "false")を組み合わせればよいでしょう。

それとも、bool変数用の指定子が新たに用意されているのでしょうか?

bool型専用の指定子は提供されません。というのも「仮に専用の指定子があっても役に立たないから」という理由があります。

C言語の言語仕様では、printfのような可変長引数をとる関数の実引数において、bool型の値は常にint型に自動変換されてしまうためです。つまり、bool型専用の指定子があったとしても、その値をbool型のまま渡すことができないのです。
(もし興味があれば;厳密には汎整数拡張(integral promotion)という変換が行われます。)

投稿2015/06/08 14:53

yohhoy

総合スコア6189

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

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

Takahito_Ogawa

2015/06/08 19:49

必要十分な説明で非常にわかりやすく教えていただきありがとうございました! 特に後半部の「提供されない理由」で、言語仕様やその背景にある思想まで知ることができました。最後にキーワードを残してくださったのも勉強になってありがたいです!
guest

0

この表をみると bool はありません。

では 世の中ではどう対処しているのでしょう?
"c printf bool" で google 検索すると こんなページをみつけました。

...
bool x = true;
printf("%d\n", x); // prints 1

But why not
printf(x ? "true" : "false");
or better
printf("%s", x ? "true" : "false");
...

%d で良いようです。
でも、これでは 1 とか 0 と表示されます。
"true", "false" と表示させる方法が提示されてますね。

投稿2015/06/07 10:22

編集2017/05/20 16:07
katoy

総合スコア22324

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

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

0

int型のときと同様に%dでよいです。
真 = 1
偽 = 0 です。

投稿2015/06/07 15:02

MasaakiIrie

総合スコア1021

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

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

0

もともとC言語には論理型はなく、intなど整数型で代用していました。その名残でprintfには論理型の表示指定がないのだと思います。
C言語自身の仕様もバージョンアップが行われていて、通称「C99」と呼ばれているものから、bool型が使えるようです。これはC言語から派生したC++言語のbool型を"逆輸入"したようです。

bool型をそれらしく"true"/"false"と表示したいのなら、以下などどうでしょう。

lang

1 printf("boolean value = %s", ((boolvalue == FALSE)? "false": "true"));

投稿2015/06/07 14:34

編集2015/06/07 14:38
yossie

総合スコア106

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

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

0

C言語のboolはc99以降でしか使えない&実装依存だったともいます。・・・たいていはintですが。
なので、stdbool.hがあれば定義を確認したほうがいいと思います。
私の環境では以下のようになっています。

lang

1/usr/include cat stdbool.h 2/* 3 * Copyright (c) 2000 Jeroen Ruigrok van der Werven <asmodai@FreeBSD.org> 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 * 27 * $FreeBSD: releng/10.1/include/stdbool.h 228878 2011-12-25 20:15:41Z ed $ 28 */ 29 30#ifndef __bool_true_false_are_defined 31#define __bool_true_false_are_defined 1 32 33#ifndef __cplusplus 34 35#define false 0 36#define true 1 37 38#define bool _Bool 39#if __STDC_VERSION__ < 199901L && __GNUC__ < 3 && !defined(__INTEL_COMPILER) 40typedef int _Bool; 41#endif 42 43#endif /* !__cplusplus */ 44#endif /* __bool_true_false_are_defined */ 45/usr/include

投稿2015/06/07 10:35

cateye

総合スコア6851

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問