C言語における%dと%i書式指定子の違い|printfとscanfでの挙動を徹底解説
書式指定子(フォーマット指定子)とは
C言語には、%dと%iという2つの整数用の書式指定子があります。%dは変数を「10進数(decimal)」として扱い、%iは「整数(integer)」として扱います。
printf()関数で出力する場合、%dと%iに実質的な違いはありません。どちらを指定しても同じ結果が出力されます。違いが現れるのは、scanf()関数で入力を読み込むときです。scanf()では%iを使うと入力文字列から基数を自動的に判別しますが、%dは常に基数を10と見なして読み込みます。
サンプルコード(C言語)
#include <stdio.h>
int main() {
int num1, num2;
int num3, num4;
scanf("%i%d", &num1, &num2);
printf("%i\t%d\n", num1, num2);
num3 = 010;
num4 = 010;
printf("%i\t%d", num3, num4);
return 0;
}
実行結果と解説
キーボードから「010」と入力した場合を例に、それぞれの指定子の動作を見てみましょう。
入力:010 出力: 8 10 8 8
ここで注目すべきは「010」という入力です。先頭に「0」が付いているため、これは8進数の記法に該当します。
%iで読み込んだ場合(num1): 先頭の「0」から8進数と判定され、値は「8」として格納されます。%dで読み込んだ場合(num2): 常に10進数として解釈されるため、値はそのまま「10」として格納されます。
一方、コード内でnum3 = 010;のように数値リテラルとして直接代入した場合は、コンパイルの時点で8進数として評価されるため、num3・num4のどちらも値は「8」になります。そのためprintf()の出力は、どちらの指定子を使っても「8」と表示されるのです。
まとめ:使い分けのポイント
printf()では%dと%iは完全に同等ですが、scanf()では次のような違いがあります。
| 指定子 | printf()での挙動 | scanf()での挙動 |
|---|---|---|
| %d | 符号付き10進数として出力 | 常に入力を10進数として解釈 |
| %i | 符号付き10進数として出力(%dと同一) | 「0x」なら16進数、「0」なら8進数、それ以外は10進数と自動判別 |
ユーザー入力で16進数や8進数にも対応させたい場合は%iを、意図しない解釈を防ぎ必ず10進数として処理したい場合は%dを使うとよいでしょう。用途に応じて適切な指定子を選択することが、バグのない堅牢なプログラムにつながります。
-
GoとJavaの違いを徹底比較!特徴と使い分けのポイント
プログラミング言語を選ぶ際、「Go」と「Java」のどちらを採用すべきか迷う開発者は少なくありません。どちらもGoogleや企業システムで広く使われる人気言語ですが、設計思想や言語仕様には大きな違いがあります。本記事では、それぞれの言語の特徴を解説したうえで、両者の主な違いを比較表を使ってわかりやすく整理します。 GoとはGoはGoogleが開発した手続き型(プロシージャル)プログラミング言語です。プログラムはパッケージ単位で構成され、シンプルで読みやすいコード記述を重視した設計になっています。動的言語に近い柔軟なパターンを取り入れつつ、静的型付けによる安全性も兼ね備えています。また、軽量スレ
-
GoとPythonの違いを徹底比較|プログラミング言語としての特徴と使い分け
Go(Golang)とはGoは、GoogleのRobert Griesemer、Rob Pike、Ken Thompsonの3名によって2007年に開発され、2009年にオープンソースとして公開された手続き型プログラミング言語です。並行処理(コンカレンシー)を含むプログラミングを容易にすること、そして開発環境への導入をシンプルにすることを目的として設計されました。シンプルな文法、高速なコンパイル、充実した標準ライブラリが特徴で、クラウドインフラやマイクロサービスの分野で広く採用されています。PythonとはPythonは、Guido van Rossumによって1991年に設計されたオブジェク