はじめまして。panicdjです。

いまCでプログラムを組んでいます。
環境はVC++ver6.0 Win32 Console Applicationです。

以下のプログラムを見てください。

#define X_MAX 10
#define Y_MAX 20
#define Z_MAX 5

int main(int argc , char ** argv)
{

int i, j, k;
int aa[10][20][5];

for (i = 0; i < X_MAX; i ++) {
for (j = 0; j < Y_MAX; j ++) {
for (k = 0; k < Z_MAX; k ++) {
aa[i][j][k] = 10.0;
}
}


return 0;
}


過去のスレッドでポインタ型によるアクセスを
すれば、処理が高速になるとかかれていました。

自分は,for文による繰り返す処理ではなく,
その「ポインタ型によるアクセス」を実装したいのです。

こんな私にアドバイスお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (9件)

> C言語などを解説しているサイトでのサンプルコードとかでしょうか??


も、含めてですね。オープンソースなプログラムとかでもよいと思います。勉強の種は沢山転がってますから探してみてください。

> これは、たとえばVCを用いているのであれば、デバッカの
プログラミングの際の話のつもりで書きました。頭の中にメモリのイメージ(箱とか?)を思い浮かべると良いです。今宣言した変数はどこにあるのか、とか、ポインタの先の実体はどこなのかというのを常に意識してということです。

> できることなら、参考になる書籍やサイトを提示させて
残念ながら Cに関しての書籍・サイトともに知りません。
が、http://alfin.mine.utsunomiya-u.ac.jp/~niy/algo/i … で集められた関数等は勉強になると思います。

参考URL:http://alfin.mine.utsunomiya-u.ac.jp/~niy/algo/i …
    • good
    • 0
この回答へのお礼

yatokesaさん、何度もアドバイスありがとうございます。

>> C言語などを解説しているサイトでのサンプルコードとかでしょうか??
>も、含めてですね。オープンソースなプログラムとかでもよいと思います。勉強の種は沢山転がってますから探してみてください。

はい、承知しました。


yatokesaさん、いろいろ教えて頂きありがとうございました。
なお、本スレッドでお世話になった方にも感謝しています。
ありがとうございました!!

お礼日時:2001/08/29 19:10

>for (i = X_MAX*Y_MAX*Z_MAX; i; i--) {


>とすると、速くなるのでしょうか?
理屈は #6:terra5さんのとおりです。また、terra5さんの仰るとおり、コンパイラが勝手に最適化する可能性もありますので、知っている人が見れば気分的に早いコードだ!って気分になれる程度の速さです^^;)。デバッグモードなどでアセンブラとの混合リストを見ると違いが分かるかもしれません。

>レベルなのでなんとかその域から脱却したのですが。
私が Cを始めたのはもう十ン年前なので...。私が学習したのは「はじめてのC」というやつですがね。公開されている色々な人のコードを見るのが良い勉強になると思います。
ポインタを理解したいのなら、常に変数がどのメモリ(スタックも含めて)に配置されているのかを考えながらコーディングすることです。
    • good
    • 0
この回答へのお礼

yatokesaさん,何度もアドバイスいただきありがとうございます。

>公開されている色々な人のコードを見るのが良い勉強になると思います

ちょっと、別件なのですが、↑は,サイトで公開されているコードとは、
C言語などを解説しているサイトでのサンプルコードとかでしょうか??

>ポインタを理解したいのなら、常に変数がどのメモリ(スタックも含めて)に配置されているのかを考えながらコーディングすることです。

上記についてもう少し教えてください.
これは、たとえばVCを用いているのであれば、デバッカの
混合モードを開いてアセンブラでどの変数がpushされているか
とか確認することなのでしょうか??

私は、詳しく混合モードの使い方
(例えば、espレジスタなどのレジスタの詳しい機能 他)
がよくわかっていません。

できることなら、参考になる書籍やサイトを提示させて
頂けると助かるのですが.

以上、どうかよろしくおねがいします!

お礼日時:2001/08/29 14:21

#4 a-kuma様



int* p_end = &aa[X_MAX][Y_MAX][Z_MAX];

int* p_end = &aa[X_MAX-1][Y_MAX-1][Z_MAX-1] + 1;
が正しいのではないかと... (^^;;;
    • good
    • 0
この回答へのお礼

syuyamakawaさん、ご助言ありがとうございましたっ!!

お礼日時:2001/08/29 14:22

ポインタを理解するなら意味がありますが、


高速化の為に・・なら、あまり意味がないですね。

まず、意味があるほどの差がでないか、変わらないですし、
読みづらいプログラムは悪です(^^;


>for (i = X_MAX*Y_MAX*Z_MAX; i; i--) {
>とすると、速くなるのでしょうか?
アセンブラレベルの話になりますが、
CPUの命令は、ある値とある値が等しいかを比べる命令が無いか,
あってもある数値が0かどうかを調べる命令より実行速度がたいてい遅いからです。
(命令が無い場合は引き算をして、結果が0かどうかを調べるという、二つの命令を実行することになります)

ただ、コンパイルしてアセンブラになる時に
どんな命令になるかはわかりませんから、
必ずしも速いとは言い切れません。
現在のコンパイラは最適化といって、
こういう高速化のための小細工は勝手にやりますので。
    • good
    • 0
この回答へのお礼

terra5さん、詳しい解説ありがとうございました.

「処理はコンパイラが最適化する」とのことですが、
処理の高速を考える際は,どのような観点から
コードを組めばよろしいのでしょうか??

よろしくおねがいします!!

お礼日時:2001/08/29 14:26

int aa[X_MAX][Y_MAX][Z_MAX];


int *p = (int *)aa + sizeof (aa) / sizeof (int);

while (p != (int *)aa)
*--p = 10;

怒られそうだ(笑)
    • good
    • 0
この回答へのお礼

mkiiさん、ご助言ありがとうございます!!

お礼日時:2001/08/29 14:23

No.2 の回答にある



>「見やすさを優先するためのプログラミングをした方が良いと思います。」

に大きく同意しつつ、もうちょっと早そうなコードを。

int aa[X_MAX][Y_MAX][Z_MAX];
int* p = &aa[0][0][0];
int* p_end = &aa[X_MAX][Y_MAX][Z_MAX];

while (p != p_end) {
  *p++ = 10;
}

もし、

int* p_end = &aa[X_MAX][Y_MAX][Z_MAX];

が気持ち悪いのであれば、

int* p_end = p + X_MAX * Y_MAX * Z_MAX;

でも OK 。

# この程度のサイズなら、たいした差は出ないと思いますよ。
    • good
    • 0
この回答へのお礼

a-kumaさん、名前によらず天使のようなアドバイスありがとうございます!

>int* p_end = &aa[X_MAX][Y_MAX][Z_MAX]; (1)

>が気持ち悪いのであれば、

>int* p_end = p + X_MAX * Y_MAX * Z_MAX; (2)

僕の場合、なぜか(1)の方の初期化の方がしっくりきてしまいました。
(2)のような初期化はたいへん参考になります。

どうもありがとうございました!

お礼日時:2001/08/28 18:56

fuji1さんと同じ回答になってしまいました



for (i = 0; i < X_MAX*Y_MAX*Z_MAX; i++) {
 ↓
for (i = X_MAX*Y_MAX*Z_MAX; i; i--) {

とした方が、多少スピードアップになると思います。

この回答への補足

すみません、なぜ以下のように、
for (i = X_MAX*Y_MAX*Z_MAX; i; i--) {
とすると、速くなるのでしょうか?

補足日時:2001/08/28 18:59
    • good
    • 0

見やすさを優先するためのプログラミングをした方が良いと思いますよ。

コンパイラの最適化によってあまり速度差がでないこともあります。

上限の決まっている領域の初期化は、for文かwhileを使うのは仕方ないことでしょう。それをふまえて、ポインタを使うと次のような感じで出きると思います。

int *p;
int aa[X_MAX][Y_MAX][Z_MAX]; // 折角defineしているのだから、定数を使いましょう
int i;

p = (int*)aa;
for (i = 0; i < X_MAX*Y_MAX*Z_MAX; i++) {
 *p++ = 10; // 10.0は浮動小数です
}

ですか、ね。
    • good
    • 0
この回答へのお礼

yatokesaさん、お返事ありがとうございます。

>見やすさを優先するためのプログラミングをした方が良いと思いますよ。
ごもっともですが、僕のプログラムはまだまだです。

細かい点も注意して頂きありがとうございます。

PS。yatokesaさんがプログラムを組む上で、または勉強した本やサイトの
中で推薦できるものがあったら教えて頂きたいのですが。。
僕は、一般的なC言語本にあるサンプルコードのような
レベルなのでなんとかその域から脱却したのですが。

お礼日時:2001/08/28 18:52

こんにちは。


int 型なのに、10.0 入れてはいけませんよ。(^o^)丿

さて、配列の場合は、基本的にはリニアにメモリを確保されることになります。
ですから、

#define X_MAX 10
#define Y_MAX 20
#define Z_MAX 5

int main(int argc , char ** argv)
{
int i;
int aa[10][20][5];
int *p ;

p = (int *)aa ;
for (i = 0; i < X_MAX * Y_MAX * Z_MAX; i ++) {
*(p++) = 10 ;
}

return 0;
}

でOKだと思います。

ただ、このリニアにとられるというのは、どんなときにもとは行かないので、アーキテクチャを確認する必要はありますね。

Wintel 系だったら大丈夫だと思いますが。
    • good
    • 0
この回答へのお礼

fuji1さん早速の解答ありがとうございます。

御返答の内容について質問があります。
>配列は、基本的にはリニアにメモリを確保されることになります。
つまり、malloc()関数を用いたときと
異なり、連続的にメモリが確保されるというこですね?

>ただ、このリニアにとられるというのは、どんなときにもとは行かないので、
>アーキテクチャを確認する必要はありますね。

↑のことがよくわかりません。
リニアに確保できないarchitectureとは例えばどのような
構造でしょうか?
よろしければついでに教えて頂きたいのですが・・・


>Wintel 系だったら大丈夫だと思いますが。
Pentium 3を使っています.

お礼日時:2001/08/28 18:47

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q浮動小数点数の誤差範囲を教えてください

猿より若干頭がいい、冴えないプログラマです。

面積を計算する際は必ず誤差がないように、doubleを使わずcurrencyを使っています。
メートルなら小数点4桁で足りますが、キロメートルとなると通貨型の4桁数では足りません。
doubleを使っても、平方キロを平方センチに変換して集計しても誤差は出ないでしょうか。

実際浮動小数点数はどの程度の誤差を生むのでしょうか。猿でも分かる程度教えてください。

基礎過ぎて動物園に帰れのような批判は勘弁してください。。。

Aベストアンサー

ネット上には色々な情報について詳しい解説や、分り易い説明のサイトが数多くあります。
質問された内容については、例えば次のようにサーチ条件を工夫してサーチして下さい。

倍精度浮動小数点 定義 精度 計算誤差
倍精度浮動小数点 解説 計算誤差

倍精度浮動小数点 解説 計算誤差 わかりやすい

==>
(1)
日経PC21 / 演算誤差の正体 - IEEE 754 浮動小数点数の仕組み
http://pc.nikkeibp.co.jp/pc21/special/gosa/eg4.shtml
==>
(2)
http://pc.nikkeibp.co.jp/pc21/special/gosa/
◆“達人”芳坂和行氏に学ぶ、エクセル「演算誤差」対策講座

(1)の中にexcelの通貨型:currencyの計算のやり方、倍精度浮動小数点の表し方、計算精度や計算誤差などが分り易く説明されています。

"単精度と倍精度では表現できる桁数や大きさが違うわけですね"

と言う言葉で(1)の中をサーチしてみて下さい。
10進17桁相当の桁数の精度があります。

地球表面の広さは、一周4万KMをcm単位で表示しても次の通りまだ7桁程余裕があります。
4*10**4(km)*1000(m)*100(cm)=4*10**9

さすがに地球表面積を平方cm単位で表そうとすると1.6*10**19(cm**2) のオーダーとなるので少し精度不足です。
平方m単位では 1.6*10**15(m**2) ですから精度的には十分です。

あなたの考えられている計算数値の一番厳しい条件の幾つかを例題として用意して、excelでcurrencyの場合、通常の場合(特に指定しなければ倍精度で計算される筈)を用意して試してみてください。

その場合、結果が分り易い数を使って下さい。
例えば、100000000999など

なお小数点付きの数では10進形式から計算機内部の倍精度形式に変換する時に変換誤差が出ますが、多分10進12桁程度の精度で十分な通常の場合は問題になりません。

ネット上には色々な情報について詳しい解説や、分り易い説明のサイトが数多くあります。
質問された内容については、例えば次のようにサーチ条件を工夫してサーチして下さい。

倍精度浮動小数点 定義 精度 計算誤差
倍精度浮動小数点 解説 計算誤差

倍精度浮動小数点 解説 計算誤差 わかりやすい

==>
(1)
日経PC21 / 演算誤差の正体 - IEEE 754 浮動小数点数の仕組み
http://pc.nikkeibp.co.jp/pc21/special/gosa/eg4.shtml
==>
(2)
http://pc.nikkeibp.co.jp/pc21/special/gosa/
◆“達人”芳坂和行氏に学ぶ、...続きを読む

Qint nII[10] = { 0 }について

久々にCを使ってプログラムを組んでいるのですが、基本的な構文を思い出せず
いくつか教えていただきたく質問させていただきました。

1)配列すべてを初期化するのに、宣言時に

int nII[10] = { 0 };

で大丈夫だった(全ての要素が0で初期化)と記憶しているのですが、間違いないでしょうか?

2)構造体の初期化は

struct tm tm;
memset(&tm, 0, sizeof(struct tm))

で大丈夫でしょうか?

3)構造体の宣言は

typedef struct{
int a;
}HOGE, *LPHOGE;

HOGE st; // <- struct HOGE stと同じ
LPHOGE pst; // <- struct HOGE* pstと同じ

で問題ないでしょうか?

以上、3つ質問になって申し訳ないのですが、よろしくお願いします。

Aベストアンサー

1)OK
2)たぶんOK
3)HOGEという名前の構造体はない(当該の構造体には名前がない)ので、
// 以下のコメント記述が誤っています。ただし、

HOGE st;
LPHOGE pst;
という定義そのものはOK

Q浮動小数点数の誤差

恐ろしく基本的なこと聞きます。

Public Class himajin100000

Shared Sub Main

Dim foo As Double = 0.5 '2進数で表現できる
Dim bar As Double = 0.1 '割り切れないから誤差が出る
System.Diagnostics.Trace.WriteLine((foo - bar).ToString) '0.4
'・・・あれ?浮動小数点数の誤差どこ行った?

End Sub

End Class

Aベストアンサー

ToStringしたときに丸められたってことはないですかね?
VBでできるかわかりませんけど、減算の結果のビットパターンを
見れば何かわかるかもしれません。

Qint kosuu; とstruct tanka_kosuu kosuu[10]; の関係は

同プログラムの内容で現在3個の質問をしておりますが!
 その質問を解決する上で4つ目の質問をさせていただきます。
 悪しからず・・・
 さて
以下のサイトのプログラムで 些細な疑問がございます。
https://oshiete.goo.ne.jp/qa/9062058.html
 で
 struct tanka_kosuu {
int tanka; 
int kosuu; 
int kingaku; /
以上の中にあるkosuuと
 struct tanka_kosuu kosuu[10];のkosuu[10]とは直接関係がありますか?
 馬鹿な質問ばかりで申し訳ございませんがよろしくお願いいたします。

Aベストアンサー

#No.1です。

>kosuu[10];をakb[10];変えたところ 以下の errorでてコンパイルできません!?
> example10.c(15) : error C2065: 'kosuu' : 定義されていない識別子です。


宣言している変数名を変更したら、その変数を利用している場所(エラーメッセージで15行目と書かれています)の変数名も変更する必要があると思いませんか?

下の例で、1行目も変数をaからbに変えたら、2行目,3行目のaも、bに変える必要があのはご理解いただけますよね?
01: int a;
02: a = 10;
03: printf("a=%d\n", a);

Qさっきの小数点切捨て→浮動小数点数の演算誤差について

さっき、http://oshiete1.goo.ne.jp/kotaeru.php3?q=685942で切捨てがうまくできないっていう質問があって、私は計算機を出してまでなんでやろ~って思って計算して、回答しました。

ところがです、あっさりとそれは浮動小数点数の演算誤差ですっていう答えがすでに出ていたんです。(勉強になりました)
うぅぅ~計算機まで出してきて計算した私ってなんてお馬鹿・・・トホホってそれはさておき

ここからが質問なんですが、浮動小数点数の演算誤差っていうのはなんとなくは知っていたのですが(本で読んだことはある程度で、もちろん人に説明できるレベルではありませんが)そういうのってどんな場合にでるのでしょう。

さっきの質問の確認のため、Excel2002でオプションの計算のしかたなども変えてみてやったのですが、一度もそういう計算結果はでなかったのですよ。
でも、質問されている方がいるということはそういう計算結果もでるっていうことですよね。なので、どういう場合にそういう結果がでるのかと気になって。

さっきの質問の所に書き込もうかとも思ったのですが、他の方の質問にさらに質問するっていうのは失礼なような気もして、新しく質問しました。

先ほど答えていらっしゃった方でも、他の方でそういうことに詳しい方でもお時間あれば教えていただけないでしょうか。

さっき、http://oshiete1.goo.ne.jp/kotaeru.php3?q=685942で切捨てがうまくできないっていう質問があって、私は計算機を出してまでなんでやろ~って思って計算して、回答しました。

ところがです、あっさりとそれは浮動小数点数の演算誤差ですっていう答えがすでに出ていたんです。(勉強になりました)
うぅぅ~計算機まで出してきて計算した私ってなんてお馬鹿・・・トホホってそれはさておき

ここからが質問なんですが、浮動小数点数の演算誤差っていうのはなんとなくは知っていたのですが(本で読んだ...続きを読む

Aベストアンサー

Excel(というよりコンピュータの)演算誤差については以下のURLの解説がわかりやすいです。

参考URL:http://pc21.nikkeibp.co.jp/pc21/special/gosa/index.shtml

Qchar AA[]{"全角文字"};から"全"という一字を取り出したい

 今晩は、Cの初心者です、宜しくお願いします。
 全角文字の入ったchar AA[]{"全角文字"};から"全"という文字一字を取り出す時にAA[0]とかくとエラーになります。
 どのようにしたら取り出せるのでしょう。
 ポインタを使う方法と使わない方法を教えて下さい。
 宜しくお願いします。

Aベストアンサー

お疲れ様です。

まずお伺いしたのがOSおよび開発するためのコンパイラです。

ロケール等の話は分かりませんが、昔のC言語で日本語を扱う場合には全角文字1文字で2個つのchar領域を使用していました。
(マルチバイト文字セットと言います。)

詳細は参考URLを参照の事。

windowsでVCと仮定した場合、charを使われていると言うことは、多分、shift-jis(シフトJIS)で文字列を扱っていると思われます。

結論として全角文字1文字だけを取り出したいという場合は、結局char2個分のデータを取り出す必要があります。

>char AA[]={'全','角'};

char AA[]="全角";
とし
>printf("%s%s\n" , AA[0],AA[1] ) ;

printf("%c%c\n" , AA[0],AA[1] ) ;
とすれば、「全」だけを表示する事が可能と思われます。

日本語を文字列で表示する為の文字コードについては
Shift-JISだけでなく、UnicodeやUTF・EUC・JISなどがあります。

もう少し詳しく記載してあるホームページはないか探してみましたが、ちょっと無理でした。

参考URL:http://marupeke296.com/CPP_charUnicodeWideChar.html

お疲れ様です。

まずお伺いしたのがOSおよび開発するためのコンパイラです。

ロケール等の話は分かりませんが、昔のC言語で日本語を扱う場合には全角文字1文字で2個つのchar領域を使用していました。
(マルチバイト文字セットと言います。)

詳細は参考URLを参照の事。

windowsでVCと仮定した場合、charを使われていると言うことは、多分、shift-jis(シフトJIS)で文字列を扱っていると思われます。

結論として全角文字1文字だけを取り出したいという場合は、結局char2個分のデータを取り出...続きを読む

QOSによる浮動小数点数の解釈と出力の仕組み

現在主流となっているコンピューターのアーキテクチャにおいては、実数表現のために浮動小数点数という手法を用いていますが、浮動小数点数表現された2進数はただの2進数であり、たとえばWindowsのプログラムが浮動小数点数を10進表記で表示したりする際には、OSのどのあたりの機能が浮動小数点数を解釈して10進数表記にするのでしょうか?

Aベストアンサー

OSじゃなくてその表示するアプリケーションがやるのが普通です。
もちろんいちいちプログラムを書くわけじゃ無くて、浮動小数点を10進文字列に変換するライブラリのサブルーチンを呼び出します。

Cだと、sprintf(文字列領域,"%e",浮動小数点の値) とか。
さらにその下のレベルでは、ライブラリのサブルーチンプログラムに含まれる、CPUの浮動小数点処理命令の組み合わせですね。

Qstruct tanka_kosuu kosuu[10];の[10]て何

#include <stdio.h>
struct tanka_kosuu {
int tanka;
int kosuu;
int kingaku;
};
int main()
{
         struct tanka_kosuu kosuu[10];
       構造体宣言 構造体名  変数名
struct tanka_kosuu kari_nyuuryoku = {-1, 0, 0};
int nyuuryoku_kosuu = 0;
while(kari_nyuuryoku.tanka != 0){
scanf("%d %d", &kari_nyuuryoku.tanka,
&kari_nyuuryoku.kosuu);
kosuu[nyuuryoku_kosuu] = kari_nyuuryoku;
nyuuryoku_kosuu++;
}
return 0;
}
以上ですが、
 struct tanka_kosuu {
int tanka;
int kosuu;
int kingaku;
以上と
struct tanka_kosuu kosuu[10];は
 以下
int tanka;
int kosuu[10];
int kingaku;
 と同じ意味ですか?
 それとも
  int tanka[10];
int kosuu[10];
int kingaku[10]; 
 と同じ意味ですか?
int tanka[10];と
 int kingaku[10];の
 合計に[10]は必要ないですよね
以上すべて私の考え方が間違っていたならごめんなさい。
 以上よろしくお願いいたします。

#include <stdio.h>
struct tanka_kosuu {
int tanka;
int kosuu;
int kingaku;
};
int main()
{
         struct tanka_kosuu kosuu[10];
       構造体宣言 構造体名  変数名
struct tanka_kosuu kari_nyuuryoku = {-1, 0, 0};
int nyuuryoku_kosuu = 0;
while(kari_nyuuryoku.tanka != 0){
scanf("%d %d", &kari_nyuuryoku.tanka,
&kari_nyuuryoku.kosuu);
kosuu[nyuuryoku_kosuu] = kari_nyuuryoku;
nyuuryoku_kosuu++;
}
return 0;
}
以上です...続きを読む

Aベストアンサー

#1です。

>struct tanka_ data { ・・・・(1)
>  int tanka;
>  int kosuu;
>  int kingaku;
>};
・・・途中省略
>} これでいいでしょうか

(1)のところは、変えてはいけません。
struct tanka_kosuu { 
のままにして下さい。
他は、問題ありません。

Q『浮動小数点』について

最近、ふと『浮動小数点』について疑問を持ちました。
それは『浮動小数点』がどんな場合に役立つのか?という事です。
C言語では標準で『float』型と『double』型がありますよね。
私は昔、C言語を始めたころにテスト・プログラムなどで使った経験しかなく
その後に『電卓ソフト』を作ろうとしたときに『誤差』が原因で役に立たない
ことを知りました。『誤差』があることは知っていましたが…。

そこで質問。内容は『浮動小数点』はどんな場面で利用されているかです。
実際の『ソフトウェア開発』や趣味でフリーソフトを作った場合も含み、あと
こんな場面で役に立つのではという事を知りたいのです。
アンケートみたいになりますが、『アンケート』カテゴリでは、あまり回答などが
集まらないと思い『C/C++』カテゴリのこちらで質問としました。

よろしくお願いします。

Aベストアンサー

#4です。

> 『科学技術計算』などでも、多少の計算誤差は問題しないでもよいのですね。

たとえば実験データの解析とかだと、元々の測定値がかなり誤差を含んでいますので、それに比べれば計算誤差は微々たるものです。それに、物理学上の計算なんかは、必ず有効数字何桁という表し方になりますから、double型の精度があれば普通は事足ります。

> 最後に『long double』型もあるのは知っていましたが、標準でサポートされたのですか。
> やはり C99 規格からですね。

C89から(つまり初めから)です。

Qint i,j; \n i=0,j=5;

int i,j;
i=0;
j=5:
と書いてあるソースは普通ですが、
int i,j;
i=0,j=5:
と書いてあるソースもあります。
後者はC++の正しい書式ですか?

カンマ演算子というのは後者のカンマのことですか?

Aベストアンサー

 正しい書式です。

i=0,j=5;
 における、「,」をカンマ演算子といいます。2項の演算子です。カンマで区切られた演算を「左から順番に」実行し、最後の演算を結果として返します。
 したがって、例の文であれば、i=0を実行し、次にj=5を実行。そして、j=5の結果の5を結果として返します。
 ・・・
 が、本来的には、あまり、例のような使い方はしませんね。よく見られるのは、次のような場合です。

 for (i=0,j=0 ; i < 50 ; ++i,++j) {

 のような形でよく見られます。for文の各式は、一つの式でなければならないので、こんな書き方をするわけです。初期化と更新部が一つにまとまり、ループが読みやすくなるのが利点かな。


人気Q&Aランキング