0

いくつかのデフォルト値に初期化したいさまざまな数値または int ベースの変数があるとします。ただし、0 には意味があり、副作用が生じる可能性があるため、0 を使用すると問題が生じる可能性があります。

これに関する規則はありますか?

私は最近 Actionscript で作業しており、オプションのパラメーターを持つさまざまな値オブジェクトを持っているため、ほとんどの変数には null を設定しますが、数値または int には null を使用できません。例:

package com.website.app.model.vo
{   
    public class MyValueObject
    {
        public function MyValueObject (
                                            _id:String=null, 
                                            _amount:Number=0,
                                            _isPurchased:Boolean=false
                                      )
        { // Constructor
            if( _id != null )           this.id          = _id;
            if( _amount != 0 )          this.amount      = _amount;
            if( _isPurchased != false ) this.isPurchased = _isPurchased;
        }

        public var id:String;
        public var amount:Number;
         public var isPurchased:Boolean;
    }
}

問題は、値が初期値から変更されていない場合、上記のコードで 0 を使用すると問題が発生する可能性があることです。変数に null 値があるかどうかは簡単に検出できます。しかし、0 は正当な値である可能性があるため、0 を検出するのはそれほど簡単ではない場合があります。パラメータをオプションにするためにデフォルト値を設定したいのですが、デバッグしにくい副作用なしに値がデフォルトから変更されたかどうかを後でコードで検出したいと考えています。

値に -1 のようなものを使用できると思います。この種のよく知られているコーディング規則があるかどうか疑問に思っていましたか? 変数とデータの性質に依存すると思います。

これは私のスタックオーバーフローに関する最初の質問です。うまくいけば、私の質問の要点は理にかなっています。

4

7 に答える 7

3

多くのデバッガは、レジスタの初期化に 0xdeadbeef を使用します。それを見るといつもクスッと笑ってしまいます。

しかし、正直なところ、あなたの質問には独自の答えが含まれています。変数が予想されることのない値を使用してください。値が何であるかは問題ではありません。

于 2009-07-12T11:07:03.580 に答える
1

ActionScriptでは、Number.NaNは、intまたはuintではなく、Numberと入力された変数にのみ割り当てることができます。

そうは言っても、AS3は名前付き引数をサポートしていないため、arguments配列をいつでも確認できます(... rest構文を使用しない限り、すべての関数に組み込まれている配列です)。その配列の長さが数値引数の位置よりも短い場合は、配列が渡されなかったことがわかります。

于 2009-07-13T03:17:13.363 に答える
1

コメントで質問されたので、CとC++について少しお話します。効率上の理由から、ローカル変数と割り当てられたメモリはデフォルトでは初期化されません。ただし、デバッグビルドは、エラーをキャッチするためにこれを行うことがよくあります。使用される一般的な値は0xcdcdcdcdであり、これはかなりありそうもないことです。上位ビットが設定されており、かなり大きな符号なし数値またはかなり大きな負の符号付き数値のいずれかです。ポインタアドレスとしては、char以外で使用された場合(X86では使用されない場合)にアライメント例外が発生するのは奇妙です。32ビット浮動小数点数としては特別な意味がないため、完全な選択ではありません。

場合によっては、0xcdcd0000や0x0000cdcdなどの変数に部分的に整列された値が表示されます。これらは、少なくとも疑わしいものとして扱うことができます。

ライブラリの割り当て領域に応じて、異なる値が使用される場合があります。これにより、不正な値が発生した可能性がある場所の手がかりが得られます(つまり、それ自体は初期化されていませんが、単一化された値からコピーされました)。

理想的な値は、メモリから読み取った配置に関係なく無効であり、すべてのプリミティブ型で無効です。また、人間には疑わしいように見えるはずなので、慣習を知らなくても、何かが足であると疑うことができます。そのため、0xdeadbeefが適切な選択になる可能性があります。これは、(16進表示)プログラマーがそれを人間の仕事であり、ランダムなチャンスではないと認識するためです。また、これは奇数であり、上位ビットが設定されているため、それに適していることにも注意してください。

于 2009-07-12T19:19:05.473 に答える
1

この値-1は、失敗または初期化されていないデータを示すために、伝統的に「範囲外」または「無効」な値として使用されることがよくあります。-1 が変数の意味的に有効な値である場合、または符号なしの型を使用している場合は、もう一度、パンのすぐ下に行きます。

于 2009-07-12T10:50:12.477 に答える
1

あなたはnull(そして正当な理由で)気に入っているようです。

于 2009-07-12T10:54:08.507 に答える
1

私はしばしばこれに最大値を使用します。あなたが言うように、多くの場合、ゼロは有効な値です。通常、max-int は理論的には有効ですが、除外しても安全です。しかしいつもではない; 気をつけて。

于 2009-07-13T03:56:43.787 に答える
1

私は 0xD15EA5ED が好きです。これは 0xDEADBEEF に似ていますが、デバッグ時には通常より正確です。

于 2009-07-21T20:18:50.497 に答える