ページ 1 / 1
どのコンパイラが標準なのか?
Posted: 2010年8月13日(金) 01:36
by reghorn
普段は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つの質問です、よろしくお願いします
Re:どのコンパイラが標準なのか?
Posted: 2010年8月13日(金) 02:40
by softya
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:どのコンパイラが標準なのか?
Posted: 2010年8月13日(金) 02:42
by たかぎ
> int n=5;
> int a[n];
とか
> 関数の先頭以外での変数宣言
に関しては、現行規格という観点ではGCCが正解です。
Visual C++のCコンパイラは古い規格に基づいています。
> float f = 1.0f;
添字のfは、その定数がfloat型であることを意味しています。
ちなみに、lをつければlong double型であることを意味します。
(整数定数の場合はまた話が別です)
Re:どのコンパイラが標準なのか?
Posted: 2010年8月13日(金) 04:57
by reghorn
御ふたりとも返信ありがとうございます。
VC++のコンパイラは古いんですね、ぐぐってみても対応予定はないような感じでした。
Cを使い始めてもう3年で入門書にあるようなことは一通り覚えたのでC99のほうも勉強してみます。
float f = 1.0f;[pre] のfはfloatを表すとのことですが付けない場合とつけた場合となにが違うのでしょう?
Re:どのコンパイラが標準なのか?
Posted: 2010年8月13日(金) 09:55
by たかぎ
1.0fのfが付いていない場合、つまり、単なる1.0であればdouble型になります。
Re:どのコンパイラが標準なのか?
Posted: 2010年8月14日(土) 00:41
by ISLe
> 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より使用するメモリ量が少なくて済みます。
Re:どのコンパイラが標準なのか?
Posted: 2010年8月14日(土) 17:33
by reghorn
御ふたりとも返信ありがとうございます
float x = 1.0;
としてfを付けなかった場合float型変数xの実体はdouble型になり、
float x=1.0f;
とした場合よりメモリ消費が多くなるというこでよろしいでしょうか?
Re:どのコンパイラが標準なのか?
Posted: 2010年8月14日(土) 17:40
by たかぎ
> メモリ消費が多くなるというこでよろしいでしょうか?
違います。
Re:どのコンパイラが標準なのか?
Posted: 2010年8月14日(土) 18:08
by reghorn
あら、違うのですか。
> fを付けなかった場合float型変数xの実体はdouble型になり
ここまではいいのでしょうか?
いいとするとメモリ消費か桁数くらいしかdoubleとfloatで異なるものが思いつかないのですが。
Re:どのコンパイラが標準なのか?
Posted: 2010年8月14日(土) 18:17
by 初級者
float型と定義した変数は、どうころんでもfloat型のままです。
実体が別の型を持つなんてことはありません。
Re:どのコンパイラが標準なのか?
Posted: 2010年8月14日(土) 21:53
by ISLe
> としてfを付けなかった場合float型変数xの実体はdouble型になり、
異なるのはリテラルの1.0と1.0fです。
ただし
> float x = 1.0;
> float x = 1.0f;
これらの場合は最適化されて結果として同じ実行コードになるでしょう。
Re:どのコンパイラが標準なのか?
Posted: 2010年8月15日(日) 01:40
by GEN
そりゃMicrosoft社製のVisualシリーズですよ。
もうこれが世界基準みたいなもんですからね。
Re:どのコンパイラが標準なのか?
Posted: 2010年8月15日(日) 01:49
by たかぎ
> そりゃMicrosoft社製のVisualシリーズですよ。
> もうこれが世界基準みたいなもんですからね。
マイクロソフトのプラットフォームに対してはそうでしょうね。
一歩外に出れば、まったく通用しませんが。
Re:どのコンパイラが標準なのか?
Posted: 2010年8月15日(日) 02:12
by reghorn
皆さん返信ありがとうございます
ここまで読んできましたが結局fを付ける意味やメリットがわかりませんでした…。
スレッドのタイトルと剥離してきたので一応解決つけときます
Re:どのコンパイラが標準なのか?
Posted: 2010年8月15日(日) 10:12
by softya
初期値の場合は意味ないですが式の途中にある値が1.0なのか1.0fなのかでは違ってきますよ。
Re:どのコンパイラが標準なのか?
Posted: 2010年8月15日(日) 10:54
by たかぎ
初期値であっても、
double pi = 3.141592653589793f;
のような場合は影響が出ます。
もともとがfloat型であれば、それをいくらdouble型に変換しても、float型より多くの精度を得ることは不可能です。
Re:どのコンパイラが標準なのか?
Posted: 2010年8月15日(日) 16:44
by reghorn
御ふたりとも回答ありがとうございます
たかぎさんの書かれた変数宣言をコピペしてprintf表示してみたら3.141592より下の桁はおかしくいました。fを外すと最後の桁まで大丈夫なようでしたのでfを付けるとおかしくなる場合はなんとなくわかりました。