どのコンパイラが標準なのか?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
reghorn

どのコンパイラが標準なのか?

#1

投稿記事 by reghorn » 15年前

普段はVC++を使っています。
VC++では次のような書き方、
#include<stdio.h>
int main(){
int n=5;
int i;
int a[n];
for(i=0;i<n;i++)
    a=i;
for(i=0;i<n;i++)
    printf("%d\n",a);
}

をするとVC++のコンパイラ(デバッガ?)に怒られるのでこれは駄目な書き方だと思っていたのですが、
gccでコンパイルすると上のような書き方で問題なく動作しました。
手持ちのCの本をみても上のような書き方をしている例はなく、書くとすれば次のようになるのだと思います。
int n=5;
int *a=(int)malloc(sizeof(int)*n);
以下略

他にも関数の先頭以外での変数宣言の可否などVC++とgccでは違いがあるようなのですが、どちらを基準に勉強していくべきなのでしょうか?
gccで可になっているものが多いのでVC++のコンパイラが古いと考えるのか、それともgccは普通じゃない書き方を許容するようにしているのかわかりませんが、自分が普段使っているものにあわせて覚えればいいものなのでしょうか?

スレッドを2つたてるのもあれな質問なのでもう一つ質問です。
float f = 1.0f;

のように代入の最後に英字をつける書き方があるようなのですが、これは何を意味するのでしょうか。

以上2つの質問です、よろしくお願いします

softya

Re:どのコンパイラが標準なのか?

#2

投稿記事 by softya » 15年前

gccはC99の規格でコンパイルされるものと思われます。
VC++は、特に意識しないで使うとC++コンパイラが働きます。C++はCの上位互換ではありますがCには無い文法を含んでいますのでVC++の場合はファイル拡張子.cを使ってください。そうすることでC言語のコンパイラが働きます。と言ってもC90の規格にしか対応していませんので、
int a[n];
はC99規格対応のgccでないと通りません。

C90と違うC99の特徴。
http://rengo49.cs.kobe-u.ac.jp/~mori/4s ... dardC.html

大体のC言語入門サイトや入門書はC90規格で書かれていると思いますし、C90対応のみのコンパイルも数多くあるんでC99を知っているに越したことは無いですが、まずC90の文法をちゃんと理解することから始めた方が良いと思います。

ちなみに
float f = 1.0f;
の最後のfはfloatのfです。

たかぎ

Re:どのコンパイラが標準なのか?

#3

投稿記事 by たかぎ » 15年前

> int n=5;
> int a[n];

とか

> 関数の先頭以外での変数宣言

に関しては、現行規格という観点ではGCCが正解です。
Visual C++のCコンパイラは古い規格に基づいています。

> float f = 1.0f;

添字のfは、その定数がfloat型であることを意味しています。
ちなみに、lをつければlong double型であることを意味します。
(整数定数の場合はまた話が別です)

reghorn

Re:どのコンパイラが標準なのか?

#4

投稿記事 by reghorn » 15年前

御ふたりとも返信ありがとうございます。
VC++のコンパイラは古いんですね、ぐぐってみても対応予定はないような感じでした。
Cを使い始めてもう3年で入門書にあるようなことは一通り覚えたのでC99のほうも勉強してみます。
float f = 1.0f;[pre] のfはfloatを表すとのことですが付けない場合とつけた場合となにが違うのでしょう?

たかぎ

Re:どのコンパイラが標準なのか?

#5

投稿記事 by たかぎ » 15年前

1.0fのfが付いていない場合、つまり、単なる1.0であればdouble型になります。

ISLe

Re:どのコンパイラが標準なのか?

#6

投稿記事 by ISLe » 15年前

> int n=5;
> int a[n];

これはgcc拡張でずいぶん前から使えますよね。

質問のコードを
$> gcc -std=c89 foo.c
とコンパイルしてもエラーになりません。
↑はgcc拡張でOK、
$> gcc -std=c99 foo.c
↑はC99規格でOKと意味が違いますね。

#gcc拡張は-pedantic付けると警告、-pedantic-errorsを付けるとエラーになります。


> fはfloatを表すとのことですが付けない場合とつけた場合となにが違うのでしょう?

floatはdoubleより使用するメモリ量が少なくて済みます。

reghorn

Re:どのコンパイラが標準なのか?

#7

投稿記事 by reghorn » 15年前

御ふたりとも返信ありがとうございます
float x = 1.0;
としてfを付けなかった場合float型変数xの実体はdouble型になり、
float x=1.0f;
とした場合よりメモリ消費が多くなるというこでよろしいでしょうか?

たかぎ

Re:どのコンパイラが標準なのか?

#8

投稿記事 by たかぎ » 15年前

> メモリ消費が多くなるというこでよろしいでしょうか?

違います。

reghorn

Re:どのコンパイラが標準なのか?

#9

投稿記事 by reghorn » 15年前

あら、違うのですか。

> fを付けなかった場合float型変数xの実体はdouble型になり
ここまではいいのでしょうか?

いいとするとメモリ消費か桁数くらいしかdoubleとfloatで異なるものが思いつかないのですが。

初級者

Re:どのコンパイラが標準なのか?

#10

投稿記事 by 初級者 » 15年前

float型と定義した変数は、どうころんでもfloat型のままです。

実体が別の型を持つなんてことはありません。

ISLe

Re:どのコンパイラが標準なのか?

#11

投稿記事 by ISLe » 15年前

> としてfを付けなかった場合float型変数xの実体はdouble型になり、

異なるのはリテラルの1.0と1.0fです。

ただし
> float x = 1.0;
> float x = 1.0f;
これらの場合は最適化されて結果として同じ実行コードになるでしょう。

GEN

Re:どのコンパイラが標準なのか?

#12

投稿記事 by GEN » 15年前

そりゃMicrosoft社製のVisualシリーズですよ。
もうこれが世界基準みたいなもんですからね。

たかぎ

Re:どのコンパイラが標準なのか?

#13

投稿記事 by たかぎ » 15年前

> そりゃMicrosoft社製のVisualシリーズですよ。
> もうこれが世界基準みたいなもんですからね。

マイクロソフトのプラットフォームに対してはそうでしょうね。
一歩外に出れば、まったく通用しませんが。

reghorn

Re:どのコンパイラが標準なのか?

#14

投稿記事 by reghorn » 15年前

皆さん返信ありがとうございます
ここまで読んできましたが結局fを付ける意味やメリットがわかりませんでした…。

スレッドのタイトルと剥離してきたので一応解決つけときます

softya

Re:どのコンパイラが標準なのか?

#15

投稿記事 by softya » 15年前

初期値の場合は意味ないですが式の途中にある値が1.0なのか1.0fなのかでは違ってきますよ。

たかぎ

Re:どのコンパイラが標準なのか?

#16

投稿記事 by たかぎ » 15年前

初期値であっても、

double pi = 3.141592653589793f;

のような場合は影響が出ます。
もともとがfloat型であれば、それをいくらdouble型に変換しても、float型より多くの精度を得ることは不可能です。

reghorn

Re:どのコンパイラが標準なのか?

#17

投稿記事 by reghorn » 15年前

御ふたりとも回答ありがとうございます
たかぎさんの書かれた変数宣言をコピペしてprintf表示してみたら3.141592より下の桁はおかしくいました。fを外すと最後の桁まで大丈夫なようでしたのでfを付けるとおかしくなる場合はなんとなくわかりました。

閉鎖

“C言語何でも質問掲示板” へ戻る