インクリメントについて

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: インクリメントについて

by 山本 » 2006年4月06日(木) 21:27

Kobu様、ほか皆様、ご報告ありがとうございます。

修正案のほうをバグ報告版に載せておきましたので、ご確認いただければ幸いです。

http://www.discoversoft.net/forum/viewtopic.php?t=928

by イグトランス » 2006年4月05日(水) 00:45

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系の言語は皆そうだと思います。

Re: インクリメントについて

by 7 » 2006年4月05日(水) 00:12

> 最終的には、インクリメントで戻り値関数が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

Re: インクリメントについて

by Kobu » 2006年4月04日(火) 23:56

最終的には、インクリメントで戻り値関数が2回呼び出されるのが一般的かどうかを知りたかっただけです。

プログラムでこのことについて疑問をもち、一瞬バグかと思ってしまっただけなので、これが仕様ならば先ほどのコードのように対処するまでですが。

Re: インクリメントについて

by 7 » 2006年4月04日(火) 23:44

> k[Command()]++
配列指定(?)に戻り値をそのまま指定しているからじゃないでしょうか。
これは、k[Command()]=k[Command()]+1と同じ動きをすると思います。
ですので一度Command()関数の戻り値を変数に保管してそれを使えばいいはずです。

コード: 全て選択

Dim k[1] As Byte
Dim l As Byte
	l=Command()
	k[l]++

Re: インクリメントについて

by Kobu » 2006年4月04日(火) 23:32

先ほどの質問の意図が伝わっていなかったみたいなんで変えます。

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: インクリメントについて

by ノッチ » 2006年4月04日(火) 23:18

> 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で初期化されたよ~な・・・

インクリメントについて

by Kobu » 2006年4月04日(火) 22:39

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]に代入してしまいます。

理由も対処法もわかりますが、他の言語ではどうなのかわかりません。
が、やはりこういう使い方は避けるべきなのでしょうか?

ページトップ