Kazukiの同人3DRPG制作【第二話】
■ このスレッドは過去ログ倉庫に格納されています
0001Kazuki
2010/09/19(日) 04:46:22ID:6P+qj1XKttp://www.kazuki-sendo.com/game/
発展途上中の素人Kazukiを中心として
DirectX9による3DRPG制作に挑戦します。
開発言語は、C++です。
長く苦しい戦いになると思われますが、
同人ゲーム制作の限界への挑戦が、当企画のテーマでもあります。
0452名前は開発中のものです。
2010/09/20(月) 22:41:27ID:JDqAfrLMcの演算は
演算子の優先順に前から後ろに演算するの。
で、代入演算子に関しては右オペランドから左オペランドに代入するってだけ。
順番はあくまでも
前から後ろ!左から右!
0453名前は開発中のものです。
2010/09/20(月) 22:42:32ID:TrTl0m0aデバッガでトレースしてみたら、演算の順番とか分かるんじゃないか?
0454名前は開発中のものです。
2010/09/20(月) 22:42:37ID:JDqAfrLM0455名前は開発中のものです。
2010/09/20(月) 22:44:03ID:ioukBWfm0456名前は開発中のものです。
2010/09/20(月) 22:44:10ID:0PP3VNsKa=4;
b-1;
a=b-a;
これは、
1.bに4を入れる
2.aに1を入れる
3.計算する
4.=の左のaに答えを入れる
は間違い。
1.と2.の順番が違う。
1.aに1を入れる
2.bに4を入れる
3.計算する
4.=の左のaに答えを入れる
が、正解。
0457名前は開発中のものです。
2010/09/20(月) 22:44:40ID:sEiPhw38だから、根本的に「右から処理する」って考えが間違ってるんだよ。
すべての演算子は基本的には左から処理をしていくんだよ。
その中で優先順位が決まってるってだけ。
>>413も書いてるけど=の優先順位が低いから逆にやってるように錯覚してるだけなんだよ。
これが物事の順番なんだよ。
0458名前は開発中のものです。
2010/09/20(月) 22:45:29ID:JDqAfrLM>>447とは別だからな
たとえ後ろから前だとしても(違うけど)
>>447や>>439の理由にはならないからな
0459名前は開発中のものです。
2010/09/20(月) 22:48:50ID:0PP3VNsKa=4;
b=1;
a=b-a;
←←←
1.aに1を入れる
2.bに4を入れる
3.計算する
4.=の左のaに答えを入れる
0460名前は開発中のものです。
2010/09/20(月) 22:50:18ID:TSB9RtrO= の左側 a と右側 a + b のどっちを先に評価するかは処理系依存
ただし = の左側と右側では評価の仕方が違う。
>>451
コマ送りで考えるのが悪いとは言わん。ただ考えが間違ってるだけで。
= 演算子は
(1) 左辺と右辺をそれぞれ評価 (順番は決まってない)
(2) 左辺に右辺を代入
(2) の働きを「後ろから前に」とどうしても表現したいなら別に構わん。ただそれは代入演算子に
ついての話であって、それを「C言語では式は後ろから前に計算される」と一般化してはいけない
>>452
前から後ろに計算されることが(おそらく)多いだろうけど、それは決まってはいない。
0461名前は開発中のものです。
2010/09/20(月) 22:50:25ID:ioukBWfm0462名前は開発中のものです。
2010/09/20(月) 22:50:30ID:FBgjHnqXなんで
a=4なのに説明では1になってるの?
とか
b-1じゃなくてb=1だろ
とかは置いとくとして
下が正解だ
0463名前は開発中のものです。
2010/09/20(月) 22:50:56ID:TrTl0m0a2 : b=1;
3 : a=b-a;
1.aに4を入れる
2.bに1を入れる
3.b-aつまり1-4を計算
4.=の左のaに答え(-3)を入れる
0464名前は開発中のものです。
2010/09/20(月) 22:51:47ID:TSB9RtrOもうめちゃくちゃだな
「aに1を入れる」とかどっから出てきたんだ
0465名前は開発中のものです。
2010/09/20(月) 22:52:34ID:KOYHA8wFこのインクリメントがわかりづらかったら。
c←a+1
a←c
このように考えてください。
CPU内のアキュムレータに一時保管するように、
インクリメントは多用するから、使えないとコードが書けませんよ
0466名前は開発中のものです。
2010/09/20(月) 22:53:06ID:0PP3VNsKさらに訂正
【正解】
a=4;
b=1;
a=b-a;
←←←
1.aに4を入れる
2.bに1を入れる
3.計算する
4.=の左のaに答えを入れる
【間違い】
a=4;
b=1;
a=b-a;
←→→
1.bに1を入れる
2.aに4を入れる
3.計算する
4.=の左のaに答えを入れる
この考え方は間違い。
0467名前は開発中のものです。
2010/09/20(月) 22:55:08ID:JDqAfrLMあれ同レベルの演算子の処理順って処理系依存だったのか
じゃあそこは間違ってたごめん
0468名前は開発中のものです。
2010/09/20(月) 22:55:17ID:ioukBWfm0469名前は開発中のものです。
2010/09/20(月) 22:55:54ID:WrM+PpRx右からやったら答えは3でしょ?
左からやったら答えは-3でしょ?
0470名前は開発中のものです。
2010/09/20(月) 22:56:09ID:0PP3VNsKこれがすごく重要ことなのよ。
これを理解するのに、かなり悩みました。
0471名前は開発中のものです。
2010/09/20(月) 22:57:17ID:TrTl0m0a理解出来てないから、もう少し悩む必要があるね。
0472名前は開発中のものです。
2010/09/20(月) 22:57:22ID:0PP3VNsK1-4は、-3は当たり前じゃないか。
そういうことを言ってるんじゃなくて。
0473名前は開発中のものです。
2010/09/20(月) 22:59:35ID:WrM+PpRx何が言いたいんだ?
右からやったら4-1になっちゃうじゃないか
0474名前は開発中のものです。
2010/09/20(月) 23:00:27ID:UJfhMPaM#include <stdio.h>
class Baka
{
int baka[10] ;
public:
int & operator + ( int i )
{ return baka[i] ; }
} ;
int main(void)
{
Baka baka ;
baka + 1 = 2 ;
printf( "%d\n", baka + 1 ) ;
return 0 ;
}
出力:
2
やってみそ
0475名前は開発中のものです。
2010/09/20(月) 23:00:39ID:TrTl0m0a→→
1-4
←←
0476名前は開発中のものです。
2010/09/20(月) 23:02:21ID:TSB9RtrO> 2 : b=1;
> 3 : a=b-a;
1. a に 4を代入
2. b に 1を代入
3-1 = の左辺 a と 右辺 b - a をそれぞれ評価
3-1-(1) 左辺の a を左辺値として評価→ 変数 a のアドレスを取得
3-2-(2) 右辺の b - a を右辺値として評価
3-2-(2-1) - の左辺 b を評価 → 1
3-2-(2-2) - の左辺 a を評価 → 4
3-2-(2-3) b - a、つまり 1 - 4 を計算 → -3
3-2 3-1で求めた左辺値に右辺の値 -3 を代入 (変数aのアドレスのメモリに -3 を格納)
*3-1-(1) と 3-1-(2) のどっちが先jに実行されるかは決まってない
*3-2-(2-1) と 3-2-(2-2) のどっちが先jに実行されるかも決まってない
もちろん 1, 2 でも 3 と同じように細かい過程があるけど省略
あと 3-1-(1) はこの場合は a のアドレスが出力されるコードに組み込まれるだけで、左辺値
を評価するようなコードが出力されることはないはず
0477名前は開発中のものです。
2010/09/20(月) 23:02:33ID:C+7XYHpH一応>>1の前提環境はVisualStudioで、86系のWindowsなんでしょ?
アセンブラの命令セットの意味がわからないなら、ちゃんと資料もあるよ
ttp://www.intel.co.jp/jp/download/index.htm
0478名前は開発中のものです。
2010/09/20(月) 23:03:39ID:KOYHA8wF0479名前は開発中のものです。
2010/09/20(月) 23:04:51ID:HKF349Sq亀だけど、初代HSPは優先順位無視するwww
0480名前は開発中のものです。
2010/09/20(月) 23:06:07ID:TSB9RtrOそうじゃなくて
a = x - y - z;
って式があったときに、- は左結合だから
a = (x - y) - z;
になる。だから二つの - 演算子で左側が先に計算されるのは処理系に依存しない。
だけど、この式の中の x, y, z の評価の順序は決まってない。
0481名前は開発中のものです。
2010/09/20(月) 23:06:52ID:KOYHA8wFこうゆうことですね
0482名前は開発中のものです。
2010/09/20(月) 23:08:58ID:TrTl0m0a0483名前は開発中のものです。
2010/09/20(月) 23:10:59ID:JDqAfrLMあ、結合ってそういう事か(恥さらし)
てことはそこは演算子の結合規則に従うって事でok?
0484名前は開発中のものです。
2010/09/20(月) 23:11:06ID:0PP3VNsKなどの演算子は、前から後ろに向かって計算します。
これが演算子の優先順位、
左から右へ
でも、全体の計算は、右から左に考える。
つまり、
=という演算子は、
+、-、*、/などの演算子みたいに
右から左に考えるのではなく、
左から右へ考える。
一つ一つの演算子には、
計算する優先順位があるのです。
0485名前は開発中のものです。
2010/09/20(月) 23:12:30ID:0PP3VNsK=という演算子は、
右から左へ
+、-、*、/という演算子は、
左から右へ
失礼しました。
0486名前は開発中のものです。
2010/09/20(月) 23:13:27ID:TSB9RtrO#include <stdio.h>
int foo(int a)
{
printf("%d\n", a);
return a;
}
int main()
{
int a, b;
a = 4;
b = 1;
a = foo(b) - foo(a);
printf("%d\n", a);
return 0;
}
これ実行してみ
処理系によって違う答えが出る可能性があるが、x86 で VC なら
1
4
-3
になるぞ。
0487名前は開発中のものです。
2010/09/20(月) 23:14:29ID:WrM+PpRx>でも、全体の計算は、右から左に考える。
そうなってるところってある?
0488名前は開発中のものです。
2010/09/20(月) 23:15:08ID:yBk4qTKXえ、っと
int a = 4; // 変数aを宣言し初期値に4を代入
int b = 1; // 変数bを宣言し初期値に1を代入
a = b - a; // 変数aに式「b - a」つまり「1 - 4」の計算結果を代入
ですよ! 宣言や初期値の順番とか関係ないない
「式」に重点を置いて!
とかいて>>484で(´・ω・`)
0489名前は開発中のものです。
2010/09/20(月) 23:15:39ID:ioukBWfm0490名前は開発中のものです。
2010/09/20(月) 23:18:19ID:Fl4ksIh50491名前は開発中のものです。
2010/09/20(月) 23:19:13ID:JDqAfrLMなんかがっつり恥さらししてて恥ずかしい
>>264が間違ってるってのは分かるけど
自分も理解まつがってた…
0492名前は開発中のものです。
2010/09/20(月) 23:21:01ID:C+7XYHpH脱線するが、このコードで違う答えが出る処理系って何かあ心当たりある?
さすがにこの程度の処理はCの規格で保証できるでしょ。
この処理結果を保証できないのであれば、それはコンパイラのバグかと。
printfの出力先のttyが特殊だったりすれば見た目上の表示は変わるかもしれないけど。
0493名前は開発中のものです。
2010/09/20(月) 23:22:20ID:0PP3VNsKint a = 4
これは初期化ですね?
コンピュータがこれを理解する時は、
「4は、変数aのint型に入れる」
という風に後ろから前に向かって読んで理解しているのです。
これはどんなに長いコードでも一緒だと思うよ。
でも、演算子には優先順位があるから、
順番が変わってくる。
0494名前は開発中のものです。
2010/09/20(月) 23:22:44ID:TrTl0m0ahttp://ideone.com/MaHBA
0495名前は開発中のものです。
2010/09/20(月) 23:24:03ID:uOYqy3lC×4は、変数aのint型に入れる
○4を、int型の変数aに入れる
0496名前は開発中のものです。
2010/09/20(月) 23:24:27ID:0PP3VNsK英語圏のアメリカで誕生したからだと思う。
ほら。
英語の場合、先にメインを言ってから
文法を書くでしょ?
0497名前は開発中のものです。
2010/09/20(月) 23:25:19ID:p01Q1cpS0498名前は開発中のものです。
2010/09/20(月) 23:26:09ID:TrTl0m0a0499名前は開発中のものです。
2010/09/20(月) 23:26:25ID:JDqAfrLM代入演算子の演算順考えれば単純に左から右じゃないって分かるじゃねぇか…>俺
おうふ
0500名前は開発中のものです。
2010/09/20(月) 23:26:33ID:HKF349Sq1.intを宣言します
2.宣言した変数はaです
3.変数aに代入します
4.代入する値は4です
0501名前は開発中のものです。
2010/09/20(月) 23:26:44ID:0PP3VNsK↑
これは、「私は好きだあなた」という意味
日本語なら、
You Love I
になってないとおかしい。
0502名前は開発中のものです。
2010/09/20(月) 23:28:10ID:0PP3VNsK日本語で考えると
I You love
ですね?
「私はあなたが好き」
0503名前は開発中のものです。
2010/09/20(月) 23:28:34ID:TrTl0m0a0504名前は開発中のものです。
2010/09/20(月) 23:29:02ID:hLC3NOpE>でも、演算子には優先順位があるから、
>順番が変わってくる。
んで、その優先順位を変えたいときは()を用いることね。
0505名前は開発中のものです。
2010/09/20(月) 23:30:20ID:TSB9RtrO「変数 a のint型」とかいうトンチキな言葉を使わないと「後ろから前」説を維持できないのか
int型の変数 a に 4 を代入する
で問題ないだろ
0506名前は開発中のものです。
2010/09/20(月) 23:30:21ID:0PP3VNsKこれを日本語の文法でそのまま訳すと
「私 好き あなた」
でも、本来の意味は、
「私は あなたが 好き」
になる。
C言語もこれと同じ。
0507名前は開発中のものです。
2010/09/20(月) 23:32:18ID:TrTl0m0a0508名前は開発中のものです。
2010/09/20(月) 23:33:28ID:HKF349SqそのC言語の文法を間違って覚えてるのがkazuki
0509名前は開発中のものです。
2010/09/20(月) 23:33:43ID:yBk4qTKXなんか、ほんとありがとう!
0510名前は開発中のものです。
2010/09/20(月) 23:34:00ID:0PP3VNsKint a = 4
この場合、一番メインの「int」を主語にもってきて、
最初に書く。
続いて二番目に重要な、「変数a」を書く。
三番目に、「演算子=」を書く。
これは目的語って読んだ方がいいか。
そして、四番目に、本当はメインのはずの
中に入れる「値4」を書く。
英語の文法にそっくりじゃないか。
0511名前は開発中のものです。
2010/09/20(月) 23:34:14ID:vydKhpMD0512名前は開発中のものです。
2010/09/20(月) 23:35:16ID:TSB9RtrO正気じゃない
0513名前は開発中のものです。
2010/09/20(月) 23:35:59ID:CgR15p8+y=x^2+2x+1
って習ったよねって一言言うといろいろと捗るってじっちゃが
0514名前は開発中のものです。
2010/09/20(月) 23:36:21ID:vydKhpMDは
変数宣言の
int a;
と代入の
a=4;
をつなげたようなもので
順序にたいした意味はないだろ
0515名前は開発中のものです。
2010/09/20(月) 23:36:44ID:GYlRLzyH横からだが、規格では決まってないと思う(少なくとも古い規格では無し)
値の評価順序(ここで言う関数の評価順序)は決まっていなかったはず
だから1,2番目が入れ替わる可能性があるのではないかと
ただしいくつかの演算子については規格で決まっている
0516名前は開発中のものです。
2010/09/20(月) 23:38:19ID:CgR15p8+asmで気にすればいいじゃな井
0517名前は開発中のものです。
2010/09/20(月) 23:39:23ID:0PP3VNsK親父の書斎に忍び込んで
パソコンを勝手に触って
COBOL(コボル)のプログラムを組んだことがあります。
もちろん遊びでね?
その時、
プログラムって英語なんだな、と思いました。
0518名前は開発中のものです。
2010/09/20(月) 23:39:31ID:/bWtWk34マヌケ過ぎるwww
0519名前は開発中のものです。
2010/09/20(月) 23:39:46ID:CgR15p8+x=2のときのyを求めよ
なんかプログラムみたい......
0520名前は開発中のものです。
2010/09/20(月) 23:41:11ID:HKF349Sqint a = 0;
int a += a++ + ++a;
0521名前は開発中のものです。
2010/09/20(月) 23:41:19ID:vydKhpMDa=b;を
a=a+B;と書いたことの説明はまだ無しっと
0522名前は開発中のものです。
2010/09/20(月) 23:41:50ID:HKF349Sqint a = 0;
a += a++ + ++a;
0523名前は開発中のものです。
2010/09/20(月) 23:42:04ID:TrTl0m0a右から左とか関係ないじゃん
0524名前は開発中のものです。
2010/09/20(月) 23:42:33ID:CgR15p8+これも右から計算しなくちゃいけないのかな......
0525名前は開発中のものです。
2010/09/20(月) 23:43:37ID:hLC3NOpEa = a + b;だとa = b;じゃなくてa += b;と同じだよね。
0526名前は開発中のものです。
2010/09/20(月) 23:44:44ID:vydKhpMD関係ないのにこの説明で>>1が後ろから前と言い出してこんなことになってる
0527名前は開発中のものです。
2010/09/20(月) 23:45:23ID:GYlRLzyHそいつは未定義では...
0528名前は開発中のものです。
2010/09/20(月) 23:47:39ID:vydKhpMD>>264だ
0529名前は開発中のものです。
2010/09/20(月) 23:49:20ID:WrM+PpRx本人だってどうせわかってるだろうし
それよか脱線してないで3DRPG作れよ
0530名前は開発中のものです。
2010/09/20(月) 23:49:44ID:TrTl0m0a0531名前は開発中のものです。
2010/09/20(月) 23:50:27ID:HKF349Sqたとえ未定義でも大丈夫
ちなみに>>1に動作を細かく説明してもらいたい
動かないならその理由も
0532名前は開発中のものです。
2010/09/20(月) 23:50:46ID:KOYHA8wF0533名前は開発中のものです。
2010/09/20(月) 23:51:26ID:/bWtWk34せめて、右辺から左辺って言えよ。
で、もう、C言語じゃなくて、Kazuki言語を作っちゃえよ。
代入演算子は、「<==」な。
a <== b + 10;
これなら、Kazukiも理解できるんだろ?
Kazuki言語は代入の別の書き方として、
b + 10 ==> a;
もあり。
つか、普通の人は、そんなこと別に拘ったり躓いたりしないっつうの。
0534名前は開発中のものです。
2010/09/20(月) 23:53:11ID:0PP3VNsKa=4;
b=1;
a=b-a;
1.式の右側のaが光ながら4に変わった!
2.式のbが光ながら1に変わった!
3.お!式全体が光って-3になったぞ!
4.式の左のaが光って-3に変わった!!
こんなアニメーションを想像してみてよ。
そしたら、俺が言ってることが解っていただけると思う。
てか、もういいよ。
この話題は・・。
いい加減、疲れてきた。(^^;
0535名前は開発中のものです。
2010/09/20(月) 23:53:47ID:vydKhpMDほんとだ前スレでも言われてた
解説の
http://www.kazuki-sendo.com/game/?p=386
が初出っぽい
0536名前は開発中のものです。
2010/09/20(月) 23:54:38ID:WrM+PpRxお前1人でおかしんじゃん
0537名前は開発中のものです。
2010/09/20(月) 23:55:12ID:TrTl0m0a0538名前は開発中のものです。
2010/09/20(月) 23:55:25ID:CgR15p8+いつもremount, rwを待っている
でもその日は来ない、常にpermission denied
0539名前は開発中のものです。
2010/09/20(月) 23:56:41ID:C+7XYHpHなるほど。確かにおっしゃる通り。
規格で決まってる演算子の代表は||や&&あたりかな。
if(a != NULL || (*a)())
みたいなコード書くのに不定だと困るし。
0540名前は開発中のものです。
2010/09/20(月) 23:57:34ID:mzMKx9Ulttp://yokohama-bj-lover.up.seesaa.net/image/hatanaka.jpeg
0541名前は開発中のものです。
2010/09/20(月) 23:58:29ID:TrTl0m0aつーかびびった
0542名前は開発中のものです。
2010/09/20(月) 23:58:34ID:0PP3VNsK悪い・・コボルは、ほとんど忘れた・・。
スペル忘れたけど、
コボルでは、4つのディビジョンを使う。
アイデンティフィケーション・ディビジョン
データ・ディビジョン
プログラム・ディビジョン
あと、一個なんだっかな?
コボルでは、データを入れる器を先に全部定義しておき、
そっから、プログラム・ディジョンで引っ張ってきて使う。
ごめん・・10年以上も昔のことなので、
ほとんど、忘れた・・。
0543名前は開発中のものです。
2010/09/20(月) 23:58:54ID:ioukBWfm理解できてないくせになにがもういいよだよ
でもまぁ実際kazuki以外のレスは勉強になるから有益なスレかもしれん
評価順が処理系依存とは知らなんだ
0544名前は開発中のものです。
2010/09/20(月) 23:59:54ID:TrTl0m0a検索乙
0545名前は開発中のものです。
2010/09/21(火) 00:00:38ID:TSB9RtrOだから、それなら>>486
a = foo(b) - foo(a);
1.式の右側のfoo(a)が光ながら4に変わった! (foo(a) が評価されて値4を取得)
2.式のfoo(b)が光ながら1に変わった! (foo(b) が評価されて値1を取得)
(以下略)
で、プログラムの出力は
4 : foo(a) の出力
1 : foo(b) の出力
-3
になるはずだよね。でもそうはならないんだけど (VC では)。
0546名前は開発中のものです。
2010/09/21(火) 00:01:24ID:CgR15p8+とる?ぁるどずさんみたいな人以外はC/C++には高級言語であってほしいわけで
0547名前は開発中のものです。
2010/09/21(火) 00:03:32ID:8ikuqbpo0548名前は開発中のものです。
2010/09/21(火) 00:04:32ID:K3ExNE1u親父はコンピュータ専門学校の講師をしていて、
専門学校のテストとか勝手に盗んで、それを解いたりして遊んでいたな(^^
書斎の本棚のプログラムの本とか、
勝手に読んだりして、
ある日、親父のパソコンを勝手に触って、
動かなくなって、おれ、涙目・・・ww
どうせばれないだろう。と思って、
電源切って黙っていたら、
なぜかバレてこっぴどく叱られたなw(^^;
あの頃は、Windows3.1が登場するよりも
ずっと前の時代です。
データもペラペラのフロッピーディスクを使っていて、
Aドライブとか、Bドライブとかあった。
きっと今の人は、想像も付かないんだろうな(^^
0549名前は開発中のものです。
2010/09/21(火) 00:05:12ID:kgfEdF2W本日のKazuki:ID:K3ExNE1u
0550名前は開発中のものです。
2010/09/21(火) 00:08:19ID:osQ4NIxS0551名前は開発中のものです。
2010/09/21(火) 00:08:57ID:kgfEdF2W>あの頃は、Windows3.1が登場するよりも
>ずっと前の時代です。
Windows3.1の発売日
日本語版
NEC版1993年5月12日
Microsoft版1993年5月18日
オッサン乙
30代にもなってこんな事してるのか
■ このスレッドは過去ログ倉庫に格納されています