インクリメントについて

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
Kobu

インクリメントについて

#1 投稿記事 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]に代入してしまいます。

理由も対処法もわかりますが、他の言語ではどうなのかわかりません。
が、やはりこういう使い方は避けるべきなのでしょうか?
ノッチ
記事: 82
登録日時: 2005年6月01日(水) 23:27
お住まい: 北海道札幌市

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

#2 投稿記事 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で初期化されたよ~な・・・
Kobu

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

#3 投稿記事 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になりますよ。
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

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

#4 投稿記事 by 7 »

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

コード: 全て選択

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

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

#5 投稿記事 by Kobu »

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

プログラムでこのことについて疑問をもち、一瞬バグかと思ってしまっただけなので、これが仕様ならば先ほどのコードのように対処するまでですが。
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

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

#6 投稿記事 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
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#7 投稿記事 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系の言語は皆そうだと思います。
山本
Site Admin
記事: 535
登録日時: 2005年5月30日(月) 15:08
連絡する:

#8 投稿記事 by 山本 »

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

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

http://www.discoversoft.net/forum/viewtopic.php?t=928
返信する