[表示 : 全て 最新50 1-99 101- 201- 301- 401- 2chのread.cgiへ]
Update time : 05/09 23:17 / Filesize : 116 KB / Number-of Response : 449
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け(入門篇) Part 17



1 名前:デフォルトの名無しさん mailto:age [2007/07/24(火) 23:17:11 ]
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 16
pc11.2ch.net/test/read.cgi/tech/1184003625/

教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 93代目
pc11.2ch.net/test/read.cgi/tech/1184506311/

66 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 11:23:29 ]
素朴な疑問だが、xとyの比はx / yではないと思うしyとxの比に等しいと思うのだがx / yとy / xの両方必要なのだろうか。

67 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 13:20:55 ]
xとyの比はx/yで、yとxの比はy/xだろ普通。

68 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 13:52:22 ]
aとbみたいな表現だとa,bが対等な関係になっちゃって
a/bかb/aかなんて代入順序に依存する式を表す事なんてできるわけがない

69 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 13:57:13 ]
うん

70 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 15:02:13 ]
-foo.c-
static void foo(){
}
void *fp() = foo;

-main.c-
extern void *fp();

main(){
 (*fp)();  // ←これは呼べる
 foo();   // ←これは呼べない
}

この理解で合っていますか?

71 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 15:13:56 ]
>>70
そのままだとコンパイルさえできない。
fpの定義がvoid (* fp)() = fooで、
宣言がextern void (* fp)()ならば、
コンパイルできるがリンクはできない。

72 名前:70 mailto:sage [2007/07/27(金) 15:26:22 ]
分かりました。ありがとうございます

staticの関数を別ファイルから呼ぶことは
どうやっても出来ないってことですか?

73 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 15:34:42 ]
>>72
だれが呼べないと書いた?
変数の定義と宣言を直せば呼べるぞ。

74 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 15:44:33 ]
ちなみに、
(*fp)();

fp();
でも呼べる。



75 名前:70 mailto:sage [2007/07/27(金) 15:47:44 ]
リンクできないってのがそうだと思って

-foo.c-
static void foo(){
}
void (*fp)() = foo;

-main.c-
#define FLAG 1
extern void (*fp)();

main(){
#if FLAG
 (*fp)();  // ←これは呼べる
#else
 foo();   // ←これは呼べない
#endif
}

FLAGが1なら普通に動作し
FLAGが0ならリンクエラーって事ですか?

76 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 15:47:52 ]
要はこうしておけばいいのだ。
--foo.h--
extern void (* fp)(void);
--foo.c--
#include "foo.h"
static void foo(void) {printf("Whee!\n");}
void (* fp)(void) = foo;
--main.c--
#include "foo.h"
int main()
{
fp();
return 0;
}
--
本来staticな関数はあくまでも同一ファイル内限定公開なのだから、お勧めはしないが。
#コンパイラの最適化の妨げにもなるし。

77 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 15:49:33 ]
>>75
>71はそういうことだね。fooと言う名前の関数エントリを探しても見つからないからリンクエラーになってしまう。
何故なら、fooはfoo.c内の静的リンケージしか持たないから名前自体が公開されないので。

78 名前:70 mailto:sage [2007/07/27(金) 15:57:12 ]
ありがとうございました

ヘッダーで公開する関数を制御したかったのですが
ヘッダーになくてもグローバルだと呼べるから駄目と言われたので
なんかないかと思いまして

79 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 16:05:19 ]
>>78
そういうことなら止めないけど、通常のstaticな関数と見分けがつくようにしておいた方がいいよ。
#関数にstaticがついてたら非公開だと思う人が圧倒的多数だから。

80 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 19:42:32 ]
すみません。質問させていただきます。
文字を入力して回文か否かを判定するプログラムを制作したのですが、すべて「回文です」という判定が表示されてしまいます。

#include<stdio.h>
int kaibun(const char *ss)
{
char *s = "ss";
char *r = "ss";
while(*r)
*s++; *r--;
while(*s){
if(*s != *r)
return(1);
*s++;
*r--; }
return(0); }
int main(void){
char str[100];
printf("文字列を入力してください");
scanf("%s",str);
if(kaibun(str))
printf("%sは回文ではありません\n",str);
else
printf("%sは回文です\n",str);
return(0);
}

どこが変なのかさっぱりわかりません。ぜひお願いします。

81 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 20:06:40 ]
>>80
多バイト文字では無いこと前提になるけど

char *s = "ss";
char *r = "ss";
ssという文字を見てるだけ
これはchar *ssのことじゃない

82 名前:81 mailto:sage [2007/07/27(金) 20:09:23 ]
あとこの部分もおかしい
>while(*r)
>*s++; *r--;

これは
while(*r) {*s++;}
*r--; ←これはwhile()の外になる

と同じで*r が0以外である間*s++ を実行
無限ループになる

83 名前:80 mailto:sage [2007/07/27(金) 20:21:12 ]
>>81,82
ありがとうございます。

char *ssを代入すればいいのでしょうか?

>while(*r)
>*s++; *r--;
のところは{}をつけたらいいのでしょうか?

すみません、始めたばかりで本当にセンスがなくて全くわかりません・・・。


84 名前:81 mailto:sage [2007/07/27(金) 20:35:59 ]
>>83
>{}をつけたらいいのでしょうか?
それでもssの先頭アドレスから r--; していくからおかしなことになる

さっきも言ったけど多バイト文字だとうまく動かないからね
1バイト文字であること前提で

まず
char *s = "ss"; char *r = "ss"; を
char *s = ss; char *r = ss; にする
次に
while(*r) *s++; *r--; を
while(*r) r++; 
r--;
にする (この r--; は while() ループの外だからね
while(*r) r++; で*r は '\0'を指すことになるから、r--; で一つ前に戻しておく

while(*s){
if(*s != *r)
return(1);
*s++;
*r--; }
return(0); }
この部分はいいと思うよ



85 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 20:55:58 ]
他人ですが、while(*s)とかやられると頭が?になってしまいます。

NULLで無い限り続けるって事ですよね?

86 名前:81 mailto:sage [2007/07/27(金) 20:57:58 ]
>>85
while(*s!='\0') または while(*s!=0) ってことです
while(*s!=NULL) はちょっと・・・私からはなんとも言えません

87 名前:80 mailto:sage [2007/07/27(金) 20:58:27 ]
>>84
こんなに丁寧に教えていただいてありがたいです。
訂正してコンパイラしてみたのですが、
char *s = ss; char *r = ss;
この部分がエラーがでて
「初期化により、ポインタの示す型からの修飾子が切り捨てられます」
と表示されてしまうのですがこれはどうしてなんでしょうか?


88 名前:81 mailto:sage [2007/07/27(金) 21:02:56 ]
>>87
警告でなくて?

const char *s = ss; const char *r = ss; でしたね
頭に const を付けてください
もしくは引数の const をはずしてください

89 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 21:26:07 ]
>>86
ポインタのポインタなら、while(*s!=NULL)だね。

90 名前:89 mailto:sage [2007/07/27(金) 21:27:17 ]
ああ、上から話が続いてたのか。
読まずにカキコした。

91 名前:81 mailto:sage [2007/07/27(金) 21:39:59 ]
>>90
いえいえ、気にしないでください

92 名前:80 mailto:sage [2007/07/27(金) 21:58:04 ]
>>88
すみません。警告です。エラーと勘違いしました。

const!そうでした!!思い出しました。ありがとうございます!
しかし、ずっと学校の演習室で自習をやっていて今帰ってきたところなので実行できていません。すみません。

81さん、スレのみなさん色々ありがとうございました。

明日行って実行してきます。
全くといっていいほどCに対してセンスがないのでここの板のみなさんは本当にすごいと思います。
頭悪いのでペースは遅いと思いますが、
ポインタまでは自分のものにしたいのでまたちょくちょくここでお世話になるかもしれません。
そのときはまたよろしくお願いします。

93 名前:81 mailto:sage [2007/07/27(金) 22:05:55 ]
>>92
今まで学校ですか
どの程度やっていたのか知りませんが、自分で>>80までやったのなら大丈夫だと思います
お疲れ様でした

94 名前:80 mailto:sage [2007/07/27(金) 22:13:46 ]
>>93
いや、あれも参考書読んだり教授に聞いたりしながらグダグダな感じで作ったものです・・・
本当にCに嫌われているみたいで、わからないのが本当にくやしくて・・・
やっぱVBできたぐらいじゃCなんて到底無理なんだなって思いましたw

また最初から参考書読み直して基礎力つけてきます



95 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 22:38:33 ]
1 2 3
4 5 6
7 8 9

こんなnum.datファイルがあったとして、これを3*3の配列に入れるためには
どうすればいいのですか?

{
int i,j;
int num[3][3];
FILE *fp;
fp = fopen("num.dat","r");

for( i = 0 ; i < 3; i ++ ){
for( j = 0 ; j < 3; j ++ ){
fscanf(fp, "%d",&num[i][j]);
}
}
fclose(fp);
}

教科書見ながらこんなようなことしてみましたが、やっぱり無理でした。

96 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:00:38 ]
>>95
それでいいんじゃね?
ためしに動かしたら、正常に動いたよ。

#include <stdio.h>

main()
{
        int i,j;
        int num[3][3];
        FILE *fp;
        fp = fopen("num.dat","r");

        for( i = 0 ; i < 3; i ++ ){
                for( j = 0 ; j < 3; j ++ ){
                        fscanf(fp, "%d",&num[i][j]);
                }
        }
        printf("%d %d %d\n", num[0][0], num[0][1], num[0][2]);
        printf("%d %d %d\n", num[1][0], num[1][1], num[1][2]);
        printf("%d %d %d\n", num[2][0], num[2][1], num[2][2]);
        fclose(fp);
}


97 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:16:36 ]
なんで>>96は>95を改悪するんだろう……

98 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:19:05 ]
>>97
printf()以外はコピペだけど?

99 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:20:10 ]
入れる場所が悪いって事でしょ。

100 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:23:11 ]
動作確認用の書き捨てコードで、コレを使えってわけじゃないよ。
>>96で動くんだから、>>95 をそのまま使えばいいよ。

101 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:26:19 ]
main()
これはないだろ

102 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:29:08 ]
できればreturn 0も欲しいところだね。

103 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:30:12 ]
できればセミコロンも欲しいところだね。

104 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:31:32 ]
>>101
リターン値がintで引数0だから、それはまったくおかしくない。

>>102
K&Rも、プログラミング言語C++も、最初の説明用のコードはreturn省略。



105 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:37:55 ]
C++ には main の return 0; は省略可能という正式な仕様がある。

106 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:38:37 ]
>>105
Cでも省略可能。

107 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:41:22 ]
C99 ならね・・・。

108 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:42:10 ]
>>104
あれ、C99でも返り値のINTって省略できたっけ?

109 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:42:46 ]
>>107
C99以前でも省略可。

110 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:47:24 ]
>>109
んなわけねー

111 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:48:09 ]
コンパイラの拡張機能に頼ってると、
規格とか分かんなくなるよね。

112 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:48:53 ]
>>109
とりあえずソース希望

113 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:49:44 ]
>>110
省略してるコード見たことないの?
ぱらぱらとめくってみたら、UNIXネットワークプログラミングのサンプルもreturn省略だな。

114 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:50:14 ]
>>110
省略できるよ、0を返すという意味にはならないけど。



115 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:51:24 ]
確かにエラーにはならんね。

116 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:51:52 ]
>>113
その「サンプル」は規格に準拠したものなのか?
説明の便宜上、省いているだけってことは?

117 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:53:16 ]
>>112
たとえば、ここの、11.12
www.kouno.jp/home/c_faq/c11.html

> exit()を呼んでもまだ警告が出る のであれば、冗長であるがreturn文を挿入するしかない

return省略すると、警告でるコンパイラもあるけど、そいうのはウンコ。

118 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:56:46 ]
>>116
ANSI準拠のK&Rでも、省略してるし、大丈夫なんじゃないの?

>>96 も動作確認用の書き捨てコードだから、省略したんだけど。

119 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 23:58:22 ]
>>117
>exit()を呼んでもまだ警告が出る のであれば、冗長であるがreturn文を挿入するしかない
これって「exit()を呼ぶならreturn は省略できる」って意味だと思うけど


120 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:03:40 ]
>>117
んー?
それmain()をvoidと宣言してる場合じゃん

121 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:10:19 ]
>>119
言われてみたら、回答がへんなような気がするね。
なんで最初に「return入れろ」じゃなくてexit()が着てるんだろ。
まあ、returnは省略を前提にしてるQ&Aに見えるけど。

>>120
質問者がvoidにしたいって言うのを、回答者はまっさきに否定してるじゃん。
その後はmain()を前提にした回答でしょ。

122 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:22:18 ]
>>121
こんな感じ(?)

>main()の戻り値は省略できるか?
>できない。main()はintを戻り値とし、(適切な型の)0個か2個の引数 を持つと定義しなければならない。
main()はintを戻り値として返さなければならない.引数も(ry・・・としなければならない
>exit()を呼んでもまだ警告が出る のであれば、冗長であるがreturn文を挿入するしかない
ただし、exit()を呼んだ場合はreturn を省略できるが、それでも警告が出るなら return を記述するしかない
つまり、return (戻り値)を呼ぶか、exit()を呼ぶかであって戻り値を省略できるわけではない

と受け取れる

123 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:27:57 ]
>>122
「exit()を呼んでも*まだ*警告が出る のであれば」
だから、本来はexit()なしでも警告も出ないってことなんじゃない?
で、そのごに「return入れろ」と言ってるということは、exit()もreturnもなしのmain()を
想定した問答なんじゃ?

124 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:38:36 ]
main 関数で return 0; 省略は規格違反。省略した場合の戻り値は未定義。
GCC でいつも -ansi -pedantic -Wall でコンパイルしている俺が言うんだから間違いない。
-std=c99 にすると警告消える。



125 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:39:46 ]
一通りの書き方を妄信する奴はPythonでもやっとけ

126 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:47:03 ]
>>124
リターン値が未定義ってだけで、規格違反ではないよ。
-ansi残して、-Wall消せば警告でないんじゃない?

127 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:50:37 ]
新ANSI C言語辞典で、mainを見ると、返却値が未定義になると書いてあるけど、
その項目のmain()のサンプルは全部return省略してるな。

Cの最小のコードは、main(){ return 0;} じゃなくて main(){}

128 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:55:22 ]
>>126
return の省略とは誰も言ってない。
return 0; の省略と言ってる。

129 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:56:30 ]
>>127
普通のコンパイラを普通に使えば
コンパイラの拡張機能として省略可能にしてあることが多いから
問題が起こることは無いんだろう。

130 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 01:01:36 ]
>>129
いや、拡張機能じゃないでしょ。
ansi互換のオプションとかでコンパイルできるし。



131 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 01:04:10 ]
>>129
>コンパイラの拡張機能として省略可能にしてあることが多いから 

どこのコンパイラ?


132 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 01:34:27 ]
>>96
ありがとうございます。

なぜか自分の方だけはいつまでもできなくて
今まで唸っていたのですが、iとjが同じになっていていました。

133 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 01:57:05 ]
ていてい!

134 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 02:16:45 ]
>>127
つまりプログラム自体は未定義でないということでは?



135 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 08:41:33 ]
>>130
戻り値が 0 になるとは限らないけどな。

136 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 08:45:55 ]
まとめ

1. main 関数で return を省略する事は可能。しかし、コンパイラによっては警告が出る可能性はある。
2. しかし、C89 の場合は戻り値未定義であり、0 が返るとは限らない。この意味で、return 0; の省略は不可能と言える。
3. C99 や C++ でなら 0 が返る事が保証される。つまり、return 0; の省略は可能である。

137 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 10:15:13 ]
もう一つ。
関数の戻り値の型はcでは省略可能。その場合、intと仮定される。
main()に関しては、void(=戻り値なし)としている例が散見されるが厳密には処理系依存。
大抵の処理系で許容されているが、その場合コマンドインタプリタへの引渡し値が0になる保障は無い。

138 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 10:25:02 ]
>>137
C99では、関数宣言で戻り値の型の省略ができなくなったはず。

139 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 10:27:45 ]
>>138
>cでは

140 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 10:44:20 ]
C99 が C ではないという口ぶりネ。
そう言いたくなる気持ちは分かるけど。

141 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 10:50:20 ]
C99なんてCじゃないやい!
とか、余計な方向へ持っていこうとするテスト(って懐かしいなぉぃ)


142 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 10:58:04 ]
コマンドインタプリタなんて概念は C にはないということもつっこんでいいのかな。

143 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 12:49:21 ]
>>136
> 2. しかし、C89 の場合は戻り値未定義であり、0 が返るとは限らない。この意味で、return 0; の省略は不可能と言える。 

動作が未定義じゃなくて、リターン値が未定義なだけだから、省略は可能。




144 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 12:51:03 ]
>>143
もっと読解力をつけた方がいい。



145 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 12:54:21 ]
>>144
>>143の理解でまったく問題ありません。

146 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 13:02:56 ]
uploader.fam.cx/img/u13877.png

147 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 13:05:23 ]
>>146
それが何か?

148 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 13:38:29 ]
>>145
return 0; を期待して return を省略する事はできない、と言ってるんだよ。

149 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 13:39:53 ]
main が未定義値を返した時の動作が未定義なら、
return を省略する事はできないと言える。
で、どうなんだ?

150 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 13:55:00 ]
>>148
かなり前から、リターン値は未定という前提で、話は進んでます。

>>149
リターン値は未定義でも、動作は未定義じゃないよ。

151 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 15:51:08 ]
どうせこうなるんならめんどくても書いたほうがいいと思う初心者だが、
プロはやっぱり出来る限り省略しないといけないぐらい(納期とか)厳しいんだろうか

152 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 15:54:16 ]
逆だな、普通に書いておくもんだ。

153 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 16:09:10 ]
return 0;
を書くことで時間が足りなくなることなんてまずないだろw

154 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 16:37:20 ]
>>150
> 2. しかし、C89 の場合は戻り値未定義であり、0 が返るとは限らない。この意味で、return 0; の省略は不可能と言える。

> return 0; を期待して return を省略する事はできない、と言ってるんだよ。
ということ。
リターン値が未定だからこそ、そうなる。



155 名前:151 mailto:sage [2007/07/28(土) 16:38:56 ]
いやでもほら、プロの悲惨な現場、って感じの読み物とか時々読んで鬱になるわけだけど、
そこで数万行のコードの話とか出るじゃん
チリも積もれば山となるのかなーと

どちらにせよ初心者が省略なんて覚えたらロクなことにならなそうなんでちゃんと書こうと思った

156 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 16:41:44 ]
ソースコードが何万行もあってもmain関数が何万個もあるわけじゃないだろw

157 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 16:43:29 ]
いやだって、プログラム単体ならmain()なんて一個しかないわけだし、
複数プログラムを連携させるようなアプリケーションなら戻り値は必要になるし、
どっちにしても省略するメリットなんて無いよ。
#行単価なんてしょうもない契約だったら尚更省略しないだろうし。

158 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 16:45:26 ]
そういえばmain関数の話だった
俺アホス

159 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 17:06:30 ]
return 0; なんて1秒もかからんちん

160 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 18:07:53 ]
return 0 つー、正常終了なら0を返すという決まりは
UNIXLinuxシステムの依存ものだから
exit(EXIT_SUCCESS); を薦めておく

161 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 18:09:50 ]
EXIT_SUCCESSが0であることも規格で決まってなかったっけ?

162 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 20:27:13 ]
決まってる。
main 関数の戻り値は 0 は正常終了、1 は異常終了、
その他は処理系定義という形で規定されている。

163 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 20:37:44 ]
main の戻り値 = プログラムがその呼び出し元にどういう値を返すか ではないからな。

環境依存の部分は main から戻ったあとで処理系が勝手にやってくれる。

164 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 20:48:04 ]
C99を使えばmainのreturn 0;は省略できるのに。



165 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 20:57:21 ]
無限ループに突入したところに恐縮ながら質問するぜ

while( !feof(fp) ) {
 fgetc(fp);
 byte++;
}

で何バイトか計算するんだけど、実際より1バイト大きくなるのはなんでだぜ?
と書いてて気付いたが前判定だから最後のインクリメントが一回分余計なのかな?

166 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 21:08:26 ]
>>165
fgetc(fp); で最後の一文字を読み込んとすると今はEOFの場所にあるわけだが
その状態でfeof(fp)を呼び出してもEOFを検出しない
現在EOFにある状態でfgetc(fp);を呼び出して初めてfeof(fp)は0以外を返す

while( fgetc(fp)!=EOF ) {
 byte++;
}
にすればよいかと






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<116KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef