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

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2008/11/14(金) 17:11:17
?と:を使った制御文みたいなのがあるじゃないですか。
あれの使い方を詳しく説明したページないでしょうか?
?で検索しても引っかからなくて困ってます。
953デフォルトの名無しさん:2008/11/14(金) 17:17:36
>>952
三項演算子、という。
954952:2008/11/14(金) 17:21:44
>>953
検索できました!ありがとうございます。
955デフォルトの名無しさん:2008/11/14(金) 17:24:16
C言語で、ツェラーの公式を使って、与えた年月日の曜日を判定する
プログラムを作っているのですが、計算結果が負の値になることがあって
そのときだけうまくいきません。
(例;2009年4月1日。関数printfを使って計算結果を出力すると-3と出てきます。)
wikipediaでは、プログラミング言語上では変形式が用いられるとありましたが
どのように公式を記述とうまくいくようになりますか?
956デフォルトの名無しさん:2008/11/14(金) 17:46:41
デバッグの基本をやるだけじゃないか
957デフォルトの名無しさん:2008/11/14(金) 19:11:58
>>956  
言い方がまずかったと思うので書き直します。
今、ツェラーの公式の部分は、
h = (q + ((m + 1)*26/10) + k + (k/4) + (j/4) - 2*j) % 7
と、そのまま書いていますが、
別の記述の方法があるのですか?
ということです
958デフォルトの名無しさん:2008/11/14(金) 19:16:32
C言語で配列の要素数を求める方法ってありましたっけ? 例えばPerlだと、

$cnt = @list;

ってやれば、@listの要素数が$cntに代入されますけど・・。
959デフォルトの名無しさん:2008/11/14(金) 19:19:04
>>958
配列のサイズを配列の1要素のサイズで割れば個数出るよ
960デフォルトの名無しさん:2008/11/14(金) 19:32:55
wikiみてんならもう少し検索すればいいのにね。
961デフォルトの名無しさん:2008/11/14(金) 19:38:05
どのwikiを?
962デフォルトの名無しさん:2008/11/14(金) 19:44:04
>>955が見てるのはwikipediaであってwikiじゃないのに、
このスレのどこからwikiが出てきたんだ
963デフォルトの名無しさん:2008/11/14(金) 20:01:59
wikipediaをwikiと略す人たちが世の中にはいるんだよ
964デフォルトの名無しさん:2008/11/14(金) 20:45:04
wikipediaなんぞwikiと同等程度の信頼性しかないって皮肉を込めてwikiって言ってんじゃないの?
965デフォルトの名無しさん:2008/11/14(金) 20:52:35
>>957
期待値は何で、いつの時点から期待値から逸れるのかをはっきりしろよ
966デフォルトの名無しさん:2008/11/14(金) 20:56:42
>>965
そういう話じゃないし。
>>955と同程度に頭悪い
967デフォルトの名無しさん:2008/11/14(金) 21:00:28
>>966
じゃ、どういう話だよ
968デフォルトの名無しさん:2008/11/14(金) 21:04:41
まじすか。。。

> wikipediaでは、プログラミング言語上では変形式が用いられるとありました

> そのまま書いていますが、別の記述の方法があるのですか?

蒟蒻畑をそのまま飲み込むと死んじゃいます、と注意書きがありました。

蒟蒻畑を食べさせたら死にました。そのまま飲み込ませたのですが何が悪かったのでしょうか?
969デフォルトの名無しさん:2008/11/14(金) 21:17:03
カップラーメンの説明では、お湯を注いで3分待つと食べられるとありました。

お湯の注ぎ方と3分の待ち方がわかりません。だれかお湯を注いで3分待って見せてください。
970デフォルトの名無しさん:2008/11/14(金) 21:18:52
>>969
みそ汁の作り方までは授業でやりました。
971デフォルトの名無しさん:2008/11/14(金) 21:22:50
>>957
jの値がおかしいとか?
972デフォルトの名無しさん:2008/11/14(金) 21:25:36
>>957
最後にさらに 7 足してもっかい % 7する
973デフォルトの名無しさん:2008/11/14(金) 21:27:09
そして1を引きます
974デフォルトの名無しさん:2008/11/14(金) 21:29:09
さらに4をかけて5で割ります
975デフォルトの名無しさん:2008/11/14(金) 21:36:40
>>964
やっぱりわかってない
976デフォルトの名無しさん:2008/11/14(金) 22:23:08
負の値に成ったら、正になるまで7を加え続ければよい。
(7を法として合同な0..6の数を見つけるということ。)
977デフォルトの名無しさん:2008/11/14(金) 22:24:17
>>962
ヒント:ファイファン派
978デフォルトの名無しさん:2008/11/14(金) 22:26:08
>>977
FFもファイファンもどっちも元は同じだけど
wikiとwikipediaは全然違うじゃん
979デフォルトの名無しさん:2008/11/14(金) 22:30:49
ツェラーの公式を使うのが、そんなにつぇらい(辛い)のかね?
980大僧正ファンザナ・ファイナム:2008/11/14(金) 22:34:21
呼んだかね。
981デフォルトの名無しさん:2008/11/14(金) 22:38:45
ちょっwwwwwwおまっwwwwwwwww節子、それファイ・ファンやない、
ファン・ファイや。
982デフォルトの名無しさん:2008/11/14(金) 23:11:02
983デフォルトの名無しさん:2008/11/15(土) 03:22:29
returnについて聞きたい事があるんだ.詳しいやつ教えてくれ.…教えてください.

以下の質問は,C90かC99に準拠した処理系での話で頼む.移植性が失われると困るんだ.

本題.
関数でreturnにはstaticな変数を用いろって話はよくわかるんだ.ローカル変数だと,関数終了時に解放さ

れてしまうっていう話だって本で読んだ.引数みたいに,返値も値渡しだったらこんな心配は起きないんだ

けど.

staticを使うっていうと,例えば,こんな感じだよな.
int func(int a) {
static ret;ret = a*a*a;
return ret;
}
(こんな関数マクロでやれよってのは無しで.あくまで例えだよ.)


(1)これだとどうなるんだ?これは大丈夫なのか?
int func1(int a) {
static ret;ret = a;
return ret*ret*ret;
}

(2)いっそこんなのどうだ?これは大丈夫なのか?
int func2(int a) {
return a*a*a;
}
984デフォルトの名無しさん:2008/11/15(土) 03:25:28
>>983
>関数でreturnにはstaticな変数を用いろ
そんな馬鹿なことどこで聞いたんだ?

(2)で全く問題ない、たしかに関数終了時に変数は解放されるが、値だもの
985デフォルトの名無しさん:2008/11/15(土) 03:33:15
>>978
全然違うって言うほど違わないよ。
wikipediaはwikiに含まれるわけだし。
986デフォルトの名無しさん:2008/11/15(土) 03:33:45
むしろstatic使わない方がいいというかその例だと必然性がないだろ
987デフォルトの名無しさん:2008/11/15(土) 03:34:18
>>983
盛大に勘違いしているようだが、staticにしなければならないのはローカル変数へのポインタをreturnする場合だ
ローカル変数自体をreturnするときは常にその値のコピーが生成されて呼び出し元に戻される
988デフォルトの名無しさん:2008/11/15(土) 03:35:16
int func(int a) {
static int ret;
ret += a;
return ret;
}
とか
int func() {
static int ret;
return &ret;
}

みたいなのとかと勘違いして無いかね
989デフォルトの名無しさん:2008/11/15(土) 03:35:21
>>983
値を返すよ。
static使えよって話のはたぶんオート変数のアドレスが値になるケースかな。
990デフォルトの名無しさん:2008/11/15(土) 03:45:03
はっきり言うと、君はC90だのなんだのを気にするようなレベルにはぜんぜん達してない
991デフォルトの名無しさん:2008/11/15(土) 03:48:06
移植性という意味ではマルチスレッドに対応できなくなってるね
992デフォルトの名無しさん:2008/11/15(土) 03:48:26
>>990 うっ
993デフォルトの名無しさん:2008/11/15(土) 03:49:39
>>983
return は、続く式の値を関数の戻り値として呼び出し元に返す。
だから、戻り値として返される値そのものは、その式に使われた変数が
局所変数であるかに関わらず、常に確実であることが保障されている。

問題は、値そのものが確実であっても、それがポインタであった場合、
その値の指す先の領域が正しくアクセス可能であるとはかぎらないことにある。
自動変数のために確保された領域は関数を抜けた時点で不定となるので、
そのような領域へのポインタを返すことは安全でないということになる。
そのため、static な変数として宣言するという手法が存在する。

念のために言っておくが、static なポインタを宣言しても何の意味もない。
static な領域を宣言して、そこへのポインタを返す。

ただし、static な変数はプログラムの起動時から終了時まで、
関数の呼び出された場所や数に関わらず常に1つだけ存在するもので、
呼出しごとの独立性もなければ初期化式の意味も異なることを忘れてはいけない。
規格の互換性を気にする前に、記憶クラス指定子についてもっと理解を深めること。
994デフォルトの名無しさん:2008/11/15(土) 04:14:40
(3)もしくは定数を用いて,こんなのは?これは絶対に50が帰ってくるんだろうか?
int func3(void) {
return 50;
}

(4)最後に配列で.例が酷くてすまん.いいのが思いつかなかった.
引数のnはN[]の大きさ.これは,配列N[n]の中で,a<N[i]<bを満たす,一番最初のN[i]を返す関数.
int lookup(int N[],a,b,n) {
int i;
for(i=0;i<n;i++) { if( N[i]>a || N[i]<b ) return N[i]; }
return EOF;
}
これだと,returnにN[i]を用いてる.N[]はポインタが渡されてるから問題ないと思うんだ.
でも,iがstaticじゃないから,N[i]のiの部分に不安が残る.これちゃんと動くだろうか?
995983:2008/11/15(土) 04:16:23
10分に一回しか書き込めないから二回にわけて書き込んだらすでにレスがあった.

996デフォルトの名無しさん:2008/11/15(土) 04:18:28
動く
997デフォルトの名無しさん:2008/11/15(土) 04:23:13
まずは式を評価するということから理解が必要だな
998デフォルトの名無しさん:2008/11/15(土) 04:24:02
値渡しだということについてだな
999デフォルトの名無しさん:2008/11/15(土) 04:25:07
> 返値も値渡しだったらこんな心配は起きない
値渡しだから心配しないでね
1000デフォルトの名無しさん:2008/11/15(土) 04:26:03
いまだせんげっとー
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。