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

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

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

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

Q&A

解決済

4回答

1466閲覧

c言語の基本的な事について

reotantan

総合スコア295

C

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

0グッド

0クリップ

投稿2015/08/20 14:11

#include <stdio.h>
int main(void){

int x=10;
float y=5.2;
char c='A';
printf("x=%d, y=%f, c=%c\n", x, y, c);
return 0;
}

int x=10;
float y=5.2;
char c='A';
の部分でまずx,y,cのデータ型を定義して
printfでなぜそのままx,y,cと打ちこんで出力できないのでしょう。
printfの括弧の中もまどろっこしいというか、cとはこういうものなのでしょうか。

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

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

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

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

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

yona

2015/08/20 14:49

どのように書くことができたらベストなのかを教えていただけないでしょうか。
reotantan

2015/08/21 01:31

printf(x,y,c)のようにかけたらいいなと思ったのですが、 自分がrubyやjavascriptから勉強を始めたために データ型に関する理解が甘かったようです。
guest

回答4

0

C言語のprintf()関数は、データとデータ型を引数とする仕様になっています。
C言語のコンパイラ仕様を大幅に変更する事は有り得ません。

C言語のprintf()関数仕様
http://www.c-tipsref.com/reference/stdio/printf.html

『C言語で可変長引数をそのまま別の関数に渡したい』に興味を惹かれました。役に立つと思いますよ!
http://qiita.com/bamchoh/items/9bec0febc2d30cd1a30e

以上

投稿2015/08/21 03:41

t2oando

総合スコア55

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

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

0

ベストアンサー

C

1printf("x=%d, y=%f, c=%c\n", 10, 5.2, 'A');

上記のようにしたいということでしょうか。
printfの仕様と言ってしまったらそれまでなのですが。
第一引数:書式文字列("x=%d, y=%f, c=%c\n")
第二引数:可変個引数(x, y, c)
書式文字列内の変換指定文字(%d,%f,%c等)を使って、あとから変更するためにあります。
なぜまどろっこしいかというと、C言語の文字列は最初に必要メモリを確保します、その際、後から入れるはずの10, 5.2, 'A'等を含めたメモリ量を先に取得する必要があります。これを解決するために変換指定文字を使用し事前に挿入位置と型を指定します。
上を踏まえると直接指定すると値の型がわからないため、メモリをどのくらいとればいいのか判断がつかないのではないでしょうか。

投稿2015/08/20 15:01

yona

総合スコア18155

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

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

reotantan

2015/08/21 01:36

c言語は他の言語に比べて処理速度が早いと聞いたのですが、 必要メモリを自ら確保するなど、型をしっかり作ったあとにその中に文字なり数字を入れていくという丁寧なコードがその速さを生み出しているのですか?
reotantan

2015/08/21 04:12

いろいろな事にこたえて頂いて、とても助かりました。 ありがとうございます
guest

0

直接打ち込んだら:
printf("x=x, y=y, c=c\n");

変数名なのか文字列なのか区別つかなくなります。
(人間だけでなく機械的にも)

printf("x={0}, y={1}, c={2}\n",x,y,c);
というふうに出来なかったのか?
ということならyubaさんが仰る通りです。

投稿2015/08/20 14:59

編集2015/08/20 15:02
ozwk

総合スコア13528

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

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

reotantan

2015/08/21 01:29

なるほど、丁寧にありがとうございました。
guest

0

printfという関数を作る側の立場になってみます。
printfには今回x,y,cと3つのデータを渡していますが渡すのは別に3つでなくとも良く、1個でも10個でも、またどういう型の変数をどういう順番で渡しても構いません。

Rubyのような動的言語なら、データは自分自身が何型かを知っています。
ところがCはほとんど機械語です。データは単なるビット列であり、それに意味づけをしてあげる、つまり型を特定してあげるのは完全にプログラマの役割です。

とすると、printfの作者としては、受け取った引数それぞれの型が何なのかを別途教えてもらう口がないとどうにもできません。それが、最初の引数の書式文字列になります。

投稿2015/08/20 14:57

yuba

総合スコア5568

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

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

reotantan

2015/08/21 01:28

そういう事でしたか、分かりやすい説明ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問