ページ 1 / 1
インクリメントについて
Posted: 2006年4月04日(火) 22:39
by Kobu
Dim i=1 As Byte,k[1] As Byte
k[Command()]++
debug
Function Command() As Byte
Command=i
If i>0 Then i=0
End Function
自分の期待では、k[1]に1を代入したいのに、k[0]に代入してしまいます。
理由も対処法もわかりますが、他の言語ではどうなのかわかりません。
が、やはりこういう使い方は避けるべきなのでしょうか?
Re: インクリメントについて
Posted: 2006年4月04日(火) 23:18
by ノッチ
> Dim i=1 As Byte,k[1] As Byte
> k[Command()]++
> debug
>
> Function Command() As Byte
> Command=i
> If i>0 Then i=0
> End Function
>
>
> 自分の期待では、k[1]に1を代入したいのに、k[0]に代入してしまいます。
>
> 理由も対処法もわかりますが、他の言語ではどうなのかわかりません。
> が、やはりこういう使い方は避けるべきなのでしょうか?
debugをCommandの最初に持ってきて確認してみてはどうでしょうか?
恐らくi=0になっていると思います。
今のABはどうなるかわかりませんが、Dimで確保した変数は0で初期化されたよ~な・・・
Re: インクリメントについて
Posted: 2006年4月04日(火) 23:32
by Kobu
先ほどの質問の意図が伝わっていなかったみたいなんで変えます。
Dim i As Byte,k[1] As Byte
k[Command()]++
Function Command() As Byte
Command=i
i=i+1
End Function
つまり言いたいことは、インクリメント使用したら、Command関数が2回呼び出されているということです。
このことが他の一般的な言語(C++など)でも2回呼び出されるかどうかという質問です。こちらの環境では確認不可能なので。
PS.ちなみに反論するようで悪いのですが、i=1になりますよ。
Re: インクリメントについて
Posted: 2006年4月04日(火) 23:44
by 7
> k[Command()]++
配列指定(?)に戻り値をそのまま指定しているからじゃないでしょうか。
これは、
k[Command()]=k[Command()]+1と同じ動きをすると思います。
ですので一度Command()関数の戻り値を変数に保管してそれを使えばいいはずです。
コード: 全て選択
Dim k[1] As Byte
Dim l As Byte
l=Command()
k[l]++
Re: インクリメントについて
Posted: 2006年4月04日(火) 23:56
by Kobu
最終的には、インクリメントで戻り値関数が2回呼び出されるのが一般的かどうかを知りたかっただけです。
プログラムでこのことについて疑問をもち、一瞬バグかと思ってしまっただけなので、これが仕様ならば先ほどのコードのように対処するまでですが。
Re: インクリメントについて
Posted: 2006年4月05日(水) 00:12
by 7
> 最終的には、インクリメントで戻り値関数が2回呼び出されるのが一般的かどうかを知りたかっただけです。
C/C++言語について書かれたページから
勝手に引用。
n++;はインクリメントといって値に1を加えることを意味し、ここではn=n+1と同じ意味です。
VBやDelphiなどは分かりませんが、C/C++言語もABと同じような動きみたいです。
> これが仕様ならば先ほどのコードのように対処するまでですが。
一番いいのはCommand()関数を使わないことです。
コード: 全て選択
'Byte型グローバル変数iの宣言と同時に1に初期化
Dim i=1 As Byte
Dim k[1] As Byte
k++
If i>0 Then i=0
Posted: 2006年4月05日(水) 00:45
by イグトランス
C/C++の場合Kobuさんのコードで問題ない(Kobuさんの意図する通りになる)はずです。
C/C++でこれに相当するコードではCommand関数は1回しか呼ばれません。
コード: 全て選択
Dim i As Byte,k[1] As Byte
k[Command()]++
Function Command() As Byte
Command=i
i=i+1
End Function
> n++;はインクリメントといって値に1を加えることを意味し、ここではn=n+1と同じ意味です。
「ここでは」がみそのはずです。
nが関数呼び出しなど副作用を伴っている場合,n++とn=n+1は等価ではないのです。
おそらくC系の言語は皆そうだと思います。
Posted: 2006年4月06日(木) 21:27
by 山本
Kobu様、ほか皆様、ご報告ありがとうございます。
修正案のほうをバグ報告版に載せておきましたので、ご確認いただければ幸いです。
http://www.discoversoft.net/forum/viewtopic.php?t=928