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: インクリメントについて
> 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で初期化されたよ~な・・・
> 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: インクリメントについて
先ほどの質問の意図が伝わっていなかったみたいなんで変えます。
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になりますよ。
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: インクリメントについて
最終的には、インクリメントで戻り値関数が2回呼び出されるのが一般的かどうかを知りたかっただけです。
プログラムでこのことについて疑問をもち、一瞬バグかと思ってしまっただけなので、これが仕様ならば先ほどのコードのように対処するまでですが。
プログラムでこのことについて疑問をもち、一瞬バグかと思ってしまっただけなので、これが仕様ならば先ほどのコードのように対処するまでですが。
Re: インクリメントについて
> 最終的には、インクリメントで戻り値関数が2回呼び出されるのが一般的かどうかを知りたかっただけです。
C/C++言語について書かれたページから勝手に引用。
> これが仕様ならば先ほどのコードのように対処するまでですが。
一番いいのはCommand()関数を使わないことです。
C/C++言語について書かれたページから勝手に引用。
VBやDelphiなどは分かりませんが、C/C++言語もABと同じような動きみたいです。n++;はインクリメントといって値に1を加えることを意味し、ここではn=n+1と同じ意味です。
> これが仕様ならば先ほどのコードのように対処するまでですが。
一番いいのはCommand()関数を使わないことです。
コード: 全て選択
'Byte型グローバル変数iの宣言と同時に1に初期化
Dim i=1 As Byte
Dim k[1] As Byte
k++
If i>0 Then i=0
C/C++の場合Kobuさんのコードで問題ない(Kobuさんの意図する通りになる)はずです。
C/C++でこれに相当するコードではCommand関数は1回しか呼ばれません。
> n++;はインクリメントといって値に1を加えることを意味し、ここではn=n+1と同じ意味です。
「ここでは」がみそのはずです。
nが関数呼び出しなど副作用を伴っている場合,n++とn=n+1は等価ではないのです。
おそらくC系の言語は皆そうだと思います。
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が関数呼び出しなど副作用を伴っている場合,n++とn=n+1は等価ではないのです。
おそらくC系の言語は皆そうだと思います。
Kobu様、ほか皆様、ご報告ありがとうございます。
修正案のほうをバグ報告版に載せておきましたので、ご確認いただければ幸いです。
http://www.discoversoft.net/forum/viewtopic.php?t=928
修正案のほうをバグ報告版に載せておきましたので、ご確認いただければ幸いです。
http://www.discoversoft.net/forum/viewtopic.php?t=928