約 5,663,645 件
https://w.atwiki.jp/usb_audio/pages/40.html
原文:Audio Device Document 1.0(PDF) USB Device Class Definition for Audio Devices Release 1.0 March 18, 1998 56 Extension Unit is not available in this case because it is bypassed). Default behavior is assumed when set to off. In the case of a single Input Pin, logical channels that enter the Extension Unit are passed unaltered for those channels that are also present in the output cluster. Logical channels not available in the output cluster are absorbed by the Extension Unit. Logical channels present in the output cluster but unavailable in the input cluster are muted. In case of multiple Input Pins, corresponding logical input channels are equally mixed together before being passed to the output. An index to a string descriptor is provided to further describe the Extension Unit. The following table outlines the Extension Unit descriptor. Table 4-15 Extension Unit Descriptor Offset Field Size Value Description 0 bLength 1 Number Size of this descriptor, in bytes 13+p+n 1 bDescriptorType 1 Constant CS_INTERFACE descriptor type. 2 bDescriptorSubtype 1 Constant EXTENSION_UNIT descriptor subtype. 3 bUnitID 1 Number Constant uniquely identifying the Unit within the audio function. This value is used in all requests to address this Unit. 4 wExtensionCode 2 Constant Vendor-specific code identifying the Extension Unit. 6 bNrInPins 1 Number Number of Input Pins of this Unit p 7 baSourceID(1) 1 Number ID of the Unit or Terminal to which the first Input Pin of this Extension Unit is connected. … … … … … 7+(p-1) baSourceID (p) 1 Number ID of the Unit or Terminal to which the last Input Pin of this Extension Unit is connected. 7+p bNrChannels 1 Number Number of logical output channels in the audio channel cluster of the Extension Unit. 7+p+1 wChannelConfig 2 Bitmap Describes the spatial location of the logical channels in the audio channel cluster of the Extension Unit. 7+p+3 iChannelNames 1 Index Index of a string descriptor, describing the name of the first logical channel in the audio channel cluster of the Extension Unit. 11+p bControlSize 1 Number Size, in bytes, of the bmControls field n USB Device Class Definition for Audio Devices Release 1.0 March 18, 1998 57 Offset Field Size Value Description 12+p bmControls n Bitmap A bit set to 1 indicates that the mentioned Control is supported D0 Enable Processing D1..(n*8-1) Reserved 12+p+n iExtension 1 Index Index of a string descriptor, describing this Extension Unit. 4.3.2.8 Associated Interface Descriptor The Associated Interface descriptor provides a means to indicate a relationship between a Terminal or a Unit and an interface, external to the audio function. It directly follows the Entity descriptor to which it is related. The bInterfaceNr field contains the interface number of the associated interface. The remainder of the descriptor depends both on the Entity to which it is related and on the interface class of the target interface. At this moment, no specific layouts are defined by this specification. The following table outlines the Associated Interface descriptor. Table 4-16 Associated Interfaces Descriptor Offset Field Size Value Description 0 bLength 1 Number Size of this descriptor, in bytes 4+x 1 bDescriptorType 1 Constant CS_INTERFACE descriptor type. 2 bDescriptorSubtype 1 Constant ASSOC_INTERFACE descriptor subtype. 3 bInterfaceNr 1 Number The interface number of the associated interface. 4 Association-specific x Number Association-specific extension to the open-ended descriptor. 4.4 AudioControl Endpoint Descriptors The following sections describe all possible endpoint-related descriptors for the AudioControl interface. 4.4.1 AC Control Endpoint Descriptors 4.4.1.1 Standard AC Control Endpoint Descriptor Because endpoint 0 is used as the AudioControl control endpoint, there is no dedicated standard control endpoint descriptor. 4.4.1.2 Class-Specific AC Control Endpoint Descriptor There is no dedicated class-specific control endpoint descriptor. USB Device Class Definition for Audio Devices Release 1.0 March 18, 1998 58 4.4.2 AC Interrupt Endpoint Descriptors 4.4.2.1 Standard AC Interrupt Endpoint Descriptor The interrupt endpoint descriptor is identical to the standard endpoint descriptor defined in Section 9.6.4, “Endpoint,” of the USB Specification and further expanded as defined in the Universal Serial Bus Class Specification. Its fields are set to reflect the interrupt type of the endpoint. This endpoint is optional. The following table outlines the standard AC Interrupt Endpoint descriptor. Table 4-17 Standard AC Interrupt Endpoint Descriptor Offset Field Size Value Description 0 bLength 1 Number Size of this descriptor, in bytes 9 1 bDescriptorType 1 Constant ENDPOINT descriptor type 2 bEndpointAddress 1 Endpoint The address of the endpoint on the USB device described by this descriptor. The address is encoded as follows D7 Direction. 1 = IN endpoint D6..4 Reserved, reset to zero D3..0 The endpoint number, determined by the designer. 3 bmAttributes 1 Bit Map D3..2 Synchronization type 00 = None D1..0 Transfer type 11 = Interrupt All other bits are reserved. 4 wMaxPacketSize 2 Number Maximum packet size this endpoint is capable of sending or receiving when this configuration is selected. Used here to pass 2-byte status information. Set to 2 if not shared, set to the appropriate value if shared. 6 bInterval 1 Number Left to the designer’s discretion. A value of 10 ms or more seems sufficient. 7 bRefresh 1 Number Reset to 0. 8 bSynchAddress 1 Endpoint Reset to 0. 4.4.2.2 Class-Specific AC Interrupt Endpoint Descriptor There is no class-specific AudioControl interrupt endpoint descriptor. 4.5 AudioStreaming Interface Descriptors The AudioStreaming (AS) interface descriptors contain all relevant information to characterize the AudioStreaming interface in full. USB Device Class Definition for Audio Devices Release 1.0 March 18, 1998 59 4.5.1 Standard AS Interface Descriptor The standard AS interface descriptor is identical to the standard interface descriptor defined in Section 9.6.3, “Interface,” of the USB Specification, except that some fields now have dedicated values. Table 4-18 Standard AS Interface Descriptor Offset Field Size Value Description 0 bLength 1 Number Size of this descriptor, in bytes 9 1 bDescriptorType 1 Constant INTERFACE descriptor type 2 bInterfaceNumber 1 Number Number of interface. A zero-based value identifying the index in the array of concurrent interfaces supported by this configuration. 3 bAlternateSetting 1 Number Value used to select an alternate setting for the interface identified in the prior field. 4 bNumEndpoints 1 Number Number of endpoints used by this interface (excluding endpoint 0). 5 bInterfaceClass 1 Class AUDIO Audio Interface Class code (assigned by the USB). See Section A.1, “Audio Interface Class Code.” 6 bInterfaceSubClass 1 Subclass AUDIO_STREAMING Audio Interface Subclass code. Assigned by this specification. See Section A.2, “Audio Interface Subclass Codes.” 7 bInterfaceProtocol 1 Protocol Not used. Must be set to 0. 8 iInterface 1 Index Index of a string descriptor that describes this interface. 4.5.2 Class-Specific AS Interface Descriptor The bTerminalLink field contains the unique Terminal ID of the Input or Output Terminal to which this interface is connected. The bDelay field holds a value that is a measure for the delay that is introduced in the audio data stream due to internal processing of the signal within the audio function. The Host software can take this value into account when phase relations between audio streams, processed by different audio functions, are important. The wFormatTag field holds information about the Audio Data Format that should be used when communicating with this interface. If the interface has a USB isochronous endpoint associated with it, the wFormatTag field describes the Audio Data Format that should be used when exchanging data with this endpoint. If the interface has no endpoint, the wFormatTag field describes the Audio Data Format that is used on the (external) connection this interface represents. This specification defines a number of standard Formats, ranging from Mono 8-bit PCM to MPEG2 7.1 encoded audio streams. A complete list of supported Audio Data Formats is provided in a separate document, USB Audio Data Formats, that is considered part of this specification. Further specific USB Device Class Definition for Audio Devices Release 1.0 March 18, 1998 60 information concerning the Audio Data Format for this interface is reported in a separate type-specific descriptor, see Section 4.5.3, “Class-Specific AS Format Type Descriptor.” This can optionally be supplemented by format-specific information through a format-specific descriptor, see Section 4.5.4, “Class-Specific AS Format-Specific Descriptor.” Table 4-19 Class-Specific AS Interface Descriptor Offset Field Size Value Description 0 bLength 1 Number Size of this descriptor in bytes 7 1 bDescriptorType 1 Constant CS_INTERFACE descriptor type. 2 bDescriptorSubtype 1 Constant AS_GENERAL descriptor subtype. 3 bTerminalLink 1 Constant The Terminal ID of the Terminal to which the endpoint of this interface is connected. 4 bDelay 1 Number Delay (d) introduced by the data path (see Section 3.4, “Inter Channel Synchronization”). Expressed in number of frames. 5 wFormatTag 2 Number The Audio Data Format that has to be used to communicate with this interface. 4.5.3 Class-Specific AS Format Type Descriptor The wFormatTag field in the class-specific AS Interface Descriptor implicitly indicates which Format Type should be used to communicate with the connection (USB or external) this interface represents. (Each Audio Data Format belongs to a certain Format Type as outlined in USB Audio Data Formats.) Each Format Type has a specific Format Type descriptor associated with it. This class-specific AS Format Type descriptor follows the class-specific AS interface descriptor and delivers format type-specific information to the Host. The details and layout of this descriptor for each of the supported Format Types is found in USB Audio Data Formats. 4.5.4 Class-Specific AS Format-Specific Descriptor As stated earlier, the wFormatTag field in the class-specific AS Interface Descriptor not only describes to what Format Type the interface belongs. It also states exactly what Audio Data Format should be used to communicate with the connection (USB or external) this interface represents. Some Audio Data Formats need additional format-specific information conveyed to the Host. Therefore, the Format Type descriptor may be followed by a class-specific AS format-specific descriptor. The details and layout of this descriptor for the Audio Data Formats that need it, is outlined in USB Audio Data Formats. 4.6 AudioStreaming Endpoint Descriptors The following sections describe all possible endpoint-related descriptors for the AudioStreaming interface. 1 - 6 - 11 - 16 - 21 - 26 - 31 - 36 - 41 - 46 - 51 - 56 - 61 - 66 - 71 - 76 - 81 - 86 - 91 - 96 - 101 - 106 - 111 - 116 - 121 - 126 ここを編集
https://w.atwiki.jp/0x0b/pages/41.html
11.6 加減演算子 (Additive Operators) Syntax AdditiveExpression MultiplicativeExpression AdditiveExpression + MultiplicativeExpression AdditiveExpression - MultiplicativeExpression 11.6.1 加法演算子 (The Addition operator) ( + ) 加法演算子は、文字列の連結、または数の加法のいずれかを行う。 生成規則 AdditiveExpression AdditiveExpression + MultiplicativeExpression は、次のように評価される AdditiveExpression を評価。 GetValue(Result(1)) を呼出す。 MultiplicativeExpression を評価。 GetValue(Result(3)) を呼出す。 ToPrimitive(Result(2)) を呼出す。 ToPrimitive(Result(4)) を呼出す。 Type(Result(5)) が String または Type(Result(6)) が String ならば、 ステップ 12 へ。 (このステップは、関係演算子の比較アルゴリズムのステップ 3 とは異なり、 かつ ではなく または であることに注意。) ToNumber(Result(5)) を呼出す。 ToNumber(Result(6)) を呼出す。 Result(8) と Result(9) に、加法演算を適用する。下記ノート参照 (セクション 11.6.3)。 Result(10) を返す。 ToString(Result(5)) を呼出す。 ToString(Result(6)) を呼出す。 Result(12) に Result(13) を連結する。 Result(14) を返す。 NOTE ステップ 5 と 6 における ToPrimitive 呼出しではヒントを提供しない。全ネイティブ ECMAScript オブジェクトは Date オブジェクトを除き、ヒントの欠如をヒント Number が与えられたように扱う; Date オブジェクトは、ヒントの欠如をヒント String が与えられたように扱う。 ホストオブジェクトは、ヒントの欠如を他の方法で扱ってよい。 11.6.2 減法演算子 (The Subtraction Operator) ( - ) 生成規則 AdditiveExpression AdditiveExpression - MultiplicativeExpression は、次のように評価される AdditiveExpression を評価。 GetValue(Result(1)) を呼出す。 MultiplicativeExpression を評価。 GetValue(Result(3)) を呼出す。 ToNumber(Result(2)) を呼出す。 ToNumber(Result(4)) を呼出す。 Result(5) と Result(6) に、減法演算を適用する。下記ノート参照 (セクション 11.6.3)。 Result(7) を返す。 11.6.3 加減演算子の数への適用 (Applying the Additive Operators ( +,- ) to Numbers) 数型の 2 個の項に適用されるとき、 + 演算子は加法を行い、項の和を生成する。 演算子は減法を行い、 2 個の数項の差を生成する。 加法は可換的演算 (commutative operation) であるが、常に結合的 (associative) ということではない。 加法の結果は、 IEEE 754 倍精度計算規則を使用して決定される どちらの項も NaN ならば、結果は NaN である。 異符号の 2 個の無限大の和は、 NaN である。 同符号の 2 個の無限大の和は、その符号の無限大である。 1 個の無限大と有限数の和は、無限大の項と等しい。 2 個の負符号の 0 の和は、 -0 である。2 個の正符号の 0、また 2 個の異符号の 0 の和は、 +0 である。 0 と 0 以外の有限数の和は、 0 以外の項と等しい。 異符号で同じ大きさの 2 個の 0 以外の有限数の和は、 +0 である。 無限大でも 0 でも NaN でもなく、項が同符号であるかまたは異なる大きさを持つ残りのケースでは、和が算出され、 IEEE 754 直近への丸めモードを使用して、直近の表現可能な値へ丸められる. 大きさが表せないほど大きいならば、演算はオーバーフローし、結果は適切な符合の無限大となる。 ECMAScript 言語は、 IEEE 754 に定義される段階的アンダーフロー (gradual underflow) のサポートを必須とする。 数型の 2 個の項に適用されるとき、 - 演算子は減法を行い、項の差を生成する; 左項が被減数で、右項が減数である。数項 a と b を与えられると、常に a-b は a+(-b) と同じ結果を生成する。 11.7 ビット幅シフト演算子 (Bitwise Shift Operators) Syntax ShiftExpression AdditiveExpression ShiftExpression AdditiveExpression ShiftExpression AdditiveExpression ShiftExpression AdditiveExpression 11.7.1 左シフト演算子 (The Left Shift Operator) ( ) 右項で指定される量により、左項上にビット幅左シフト演算を行う。 生成規則 ShiftExpression ShiftExpression AdditiveExpression は、次のように評価される ShiftExpression を評価。 GetValue(Result(1)) を呼出す。 AdditiveExpression を評価。 GetValue(Result(3)) を呼出す。 ToInt32(Result(2)) を呼出す。 ToUint32(Result(4)) を呼出す。 Result(6) の下位 5 ビット以外をマスクする。 つまり、 Result(6) 0x1F を算出する。 Result(5) を Result(7) ビット左シフトする。結果は符号付き 32 ビット整数である。 Result(8) を返す。 11.7.2 符号付き右シフト演算子 (The Signed Right Shift Operator) ( ) 右項で指定される量により、左項上に符号を伴うビット幅右シフト演算を行う。 生成規則 ShiftExpression ShiftExpression AdditiveExpression は、次のように評価される ShiftExpression を評価。 GetValue(Result(1)) を呼出す。 AdditiveExpression を評価。 GetValue(Result(3)) を呼出す。 ToInt32(Result(2)) を呼出す。 ToUint32(Result(4)) を呼出す。 Result(6) の下位 5 ビット以外をマスクする。 つまり、 Result(6) 0x1F を算出する。 Result(5) を Result(7) ビット符号拡張右シフトする。最上位ビットは伝播する。結果は符号付き 32 ビット整数である。 Result(8) を返す。 11.7.3 符号なし右シフト演算子 (The Unsigned Right Shift Operator) ( ) 右項で指定される量により、左項上に 0 を伴うビット幅右シフト演算を行う。 生成規則 ShiftExpression ShiftExpression AdditiveExpression は、次のように評価される ShiftExpression を評価。 GetValue(Result(1)) を呼出す。 AdditiveExpression を評価。 GetValue(Result(3)) を呼出す。 ToUint32(Result(2)) を呼出す。 ToUint32(Result(4)) を呼出す。 Result(6) の下位 5 ビット以外をマスクする。 つまり、 Result(6) 0x1F を算出する。 Result(5) を Result(7) ビット分だけ 0 拡張右シフトする。空ビットは 0 で埋められる。結果は符号なし 32 ビット整数である。 Result(8) を返す。 11.8 関係演算子 (Relational Operators) Syntax RelationalExpression ShiftExpression RelationalExpression ShiftExpression RelationalExpression ShiftExpression RelationalExpression = ShiftExpression RelationalExpression = ShiftExpression RelationalExpression instanceof ShiftExpression RelationalExpression in ShiftExpression RelationalExpressionNoIn ShiftExpression RelationalExpressionNoIn ShiftExpression RelationalExpressionNoIn ShiftExpression RelationalExpressionNoIn = ShiftExpression RelationalExpressionNoIn = ShiftExpression RelationalExpressionNoIn instanceof ShiftExpression NOTE NoIn 変化形は、for 文の中の in 演算子を含む関係式内の in 演算子の混乱の回避に必要である。 Semantics 関係演算子の評価の結果は常に Boolean 型であり、演算子に名づけられた関係がその 2 項間に維持されているかどうかを反映する。 RelationalExpressionNoIn 生成規則は RelationalExpression 生成規則と同様に評価されるが、内部の RelationalExpression の代わりに、RelationalExpressionNoIn が評価される。 11.8.1 Less-than 演算子 (The Less-than Operator) ( ) 生成規則 RelationalExpression RelationalExpression ShiftExpression は、次のように評価される RelationalExpression を評価。 GetValue(Result(1)) を呼出す。 ShiftExpression を評価。 GetValue(Result(3)) を呼出す。 比較 Result(2) Result(4) を実行する。 (セクション 11.8.5.) Result(5) が undefined ならば、 false を返す。そうでなければ、 Result(5) を返す。 11.8.2 Grater-than 演算子 (The Greater-than Operator) ( ) 生成規則 RelationalExpression RelationalExpression ShiftExpression は、次のように評価される RelationalExpression を評価。 GetValue(Result(1)) を呼出す。 ShiftExpression を評価。 GetValue(Result(3)) を呼出す。 比較 Result(4) Result(2) を実行する。 (セクション 11.8.5.) Result(5) が undefined ならば、 false を返す。そうでなければ、 Result(5) を返す。 11.8.3 Less-than-or-equal 演算子 (The Less-than-or-equal Operator) ( = ) 生成規則 RelationalExpression RelationalExpression = ShiftExpression は、次のように評価される RelationalExpression を評価。 GetValue(Result(1)) を呼出す。 ShiftExpression を評価。 GetValue(Result(3)) を呼出す。 比較 Result(4) Result(2) を実行する (セクション 11.8.5.) Result(5) が true または undefinedならば、 false を返す。そうでなければ、 true を返す。 11.8.4 Greater-than-or-equal 演算子 (The Greater-than-or-equal Operator) ( = ) 生成規則 RelationalExpression RelationalExpression = ShiftExpression は、次のように評価される RelationalExpression を評価。 GetValue(Result(1)) を呼出す。 ShiftExpression を評価。 GetValue(Result(3)) を呼出す。 比較 Result(2) Result(4) を実行する。 (セクション 11.8.5.) Result(5) が true または undefined ならば、 false を返す。そうでなければ、 true を返す。 11.8.5 抽象的関係比較アルゴリズム (The Abstract Relational Comparison Algorithm) x と y を値として、比較 x y は、 true, false, または undefined を生成する (少なくとも一方の項が NaN であることを示す)。 この比較は次のように実行される ToPrimitive(x, hint Number) を呼出す。 ToPrimitive(y, hint Number) を呼出す。 If Type(Result(1)) が String かつ Type(Result(2)) が String ならば、ステップ 16 へ。 (このステップが or の代わりに and を使い、加法演算子 + のためのアルゴリズムにおいてステップ 7 から異なることに注意。) ToNumber(Result(1)) を呼出す。 ToNumber(Result(2)) を呼出す。 Result(4) が NaN ならば、 undefined を返す。 Result(5) が NaN ならば、 undefined を返す。 Result(4) と Result(5) が同じ数値ならば、 false を返す。 Result(4) が +0 かつ Result(5) が -0 ならば、 false を返す。 Result(4) が -0 かつ Result(5) が +0 ならば、 false を返す。 Result(4) が +∞ ならば、 false を返す。 Result(5) が +∞ ならば、 true を返す。 Result(5) が -∞ ならば、 false を返す。 Result(4) が -∞ ならば、 true を返す。 Result(4) の数学値が Result(5) の数学値より小さければ、 true を返す。 -- これらの数学値は共に有限な 0 以外の値であることに注意 -- そうでなければ、 false を返す。 Result(2) が Result(1) の接頭辞ならば、 false を返す。 (q が p と他の文字列 r の連結結果でありえるならば、文字列値 p は文字列値 q の接頭辞である。r を空文字列とすれば任意の文字列はそれ自身の接頭辞であることに注意。) Result(1) が Result(2) の接頭辞ならば、 true を返す。 Result(1) の位置 k の文字が Result(2) の位置 k の文字と異なるような負でない最小整数を k とする。 (どちらの文字列も互いの接頭辞とならないような k が存在しなければならない。) m を Result(1) の位置 k の文字のコードポイント値である整数とする。 n を Result(2) の位置 k の文字のコードポイント値である整数とする。 m n ならば true を返し、そうでなければ、 false を返す。 NOTE 文字列比較は、単純な辞書的序列をコードポイント値のシーケンスの値に用いる。文字や文字列の等価性、および Unicode 仕様 で定義される順序の照合の、これ以上複雑で意味論的に指向した定義を用いる試みはない。それゆえ、 Unicode 標準によって規準的に等しい文字列が不等価と検査されるかもしれない。効果においてこのアルゴリズムは、双方の文字列が既に正規化形式であることを想定する。 11.8.6 instanceof 演算子 (The instanceof operator) 生成規則 RelationalExpression RelationalExpression instanceof ShiftExpression は、次のように評価される RelationalExpression を評価。 GetValue(Result(1)) を呼出す。 ShiftExpression を評価。 GetValue(Result(3)) を呼出す。 Result(4) がオブジェクトでなければ、例外 TypeError を投げる。 Result(4) が HasInstance メソッドを持たなければ、例外 TypeError を投げる。 Result(4) の HasInstance メソッドを呼び、パラメータ Result(2) を渡す。 Result(7) を返す。 11.8.7 in 演算子 (The in operator) 生成規則 RelationalExpression RelationalExpression in ShiftExpression は、次のように評価される RelationalExpression を評価。 GetValue(Result(1)) を呼出す。 ShiftExpression を評価。 GetValue(Result(3)) を呼出す。 Result(4) がオブジェクトでなければ、例外 TypeError を投げる。 ToString(Result(2)) を呼出す。 Result(4) の HasProperty メソッドを呼び、パラメータに Result(6) を渡す。 Result(7) を返す。 11.9 等価演算子 (Equality Operators) Syntax EqualityExpression RelationalExpression EqualityExpression == RelationalExpression EqualityExpression != RelationalExpression EqualityExpression === RelationalExpression EqualityExpression !== RelationalExpression EqualityExpressionNoIn RelationalExpressionNoIn EqualityExpressionNoIn == RelationalExpressionNoIn EqualityExpressionNoIn != RelationalExpressionNoIn EqualityExpressionNoIn === RelationalExpressionNoIn EqualityExpressionNoIn !== RelationalExpressionNoIn Semantics 等価演算子評価の結果は常に Boolean 型であり、演算子で示される関連性が 2 項間で維持されているかどうかを反映する。 EqualityExpressionNoIn 生成規則は EqualityExpression 生成規則と同様に評価されるが、内部の EqualityExpression と RelationalExpression の代わりに、それぞれ EqualityExpressionNoIn と RelationalExpressionNoIn が評価される。 11.9.1 等価演算子 (The Equals Operator) ( == ) 生成規則 EqualityExpression EqualityExpression == RelationalExpression は、次のように評価される EqualityExpression を評価。 GetValue(Result(1)) を呼出す。 RelationalExpression を評価。 GetValue(Result(3)) を呼出す。 比較 Result(4) == Result(2) を実行する。 (セクション 11.9.3) Result(5) を返す。 11.9.2 不等価演算子 (The Does-not-equals Operator) ( != ) 生成規則 EqualityExpression EqualityExpression != RelationalExpression は、次のように評価される EqualityExpression を評価。 GetValue(Result(1)) を呼出す。 RelationalExpression を評価。 GetValue(Result(3)) を呼出す。 比較 Result(4) == Result(2) を実行する。 (セクション 11.9.3) Result(5) が true なら、 false を返す。そうでなければ、 true を返す。 11.9.3 抽象的等価比較アルゴリズム (The Abstract Equality Comparison Algorithm) x と y を値とする比較 x==y は、 true または false を生成する。次のように比較は実行される Type(x) と Type(y) が異なる場合は、ステップ 14 へ。 Type(x) が Undefined ならば、 true を返す。 Type(x) が Null ならば、 true を返す。 Type(x) が Number でなければ、ステップ 11 へ。 x が NaN ならば、 false を返す。 y が NaN ならば、 false を返す。 x が y と同じ数ならば、 true を返す。 x が +0 で y が -0 ならば、 true を返す。 x が -0 で y が +0 ならば、 true を返す。 false を返す。 Type(x) が String ならば、x と y の文字シーケンスが完全に同じ(同じ長さで対応する位置に同じ文字がある)なら true を返し、そうでなければ false を返す。 Type(x) が Boolean ならば、x と y がともに true かともに false なら true を返し、そうでなければ false を返す。 x と y が同じオブジェクトを参照しているか、または互いに結合しているオブジェクト(セクション13.1.2) を参照していれば true を返し、そうでなければ false を返す。 x が null で y が undefined ならば、 true を返す。 x が undefined で y が null ならば、 true を返す。 Type(x) が Number で Type(y) が String ならば、比較 x == ToNumber(y) の結果を返す。 Type(x) が String で Type(y) が Number ならば、比較 ToNumber(x) == y の結果を返す。 Type(x) が Boolean ならば、比較 ToNumber(x) == y の結果を返す。 Type(y) が Boolean ならば、比較 x == ToNumber(y) の結果を返す。 Type(x) が String か Number で Type(y) が Object ならば、比較 x == ToPrimitive(y) の結果を返す。 Type(x) が Object で Type(y) が String か Number ならば、比較 ToPrimitive(x) == y の結果を返す。 false を返す。 NOTE 等価の上の定義を与えられる "" + a == "" + b で文字列比較を強制できる。 a - 0 == b - 0 で数値比較を強制できる。 !a == !b で真偽比較を強制できる。 等価演算子は次の invariants を維持する A != B は !(A == B) と等しい。 A == B は、 A と B の評価の順序を除き、 B == A と等しい。 等価演算子は常に通過 (transitive) ではない。例えば、同じ文字列値をあらわす 2 個の区別される String オブジェクトが存在可能である; それぞれの String オブジェクトは == 演算子によって文字列値が等しいとは考えられるが、 2 個の String オブジェクトは互いに等価にはならな。 文字列比較は、コードポイント値のシーケンスの値に単純な等価検査を使用する。文字や文字列の等価性、および Unicode 2.0 仕様 で定義される順序の照合の、より複雑で意味論的に指向した定義を用いる試みはない。それゆえ、 Unicode 標準によって規準的に等しい文字列が不等価と検査されるかもしれない。効果においてこのアルゴリズムは、双方の文字列が既に正規化形式であることを想定する。 11.9.4 厳密等価演算子 (The Strict Equals Operator) ( === ) 生成規則 EqualityExpression EqualityExpression === RelationalExpression は、次のように評価される EqualityExpression を評価。 GetValue(Result(1)) を呼出す。 RelationalExpression を評価。 GetValue(Result(3)) を呼出す。 比較 Result(4) === Result(2) を行う。 (後述) Result(5) を返す。 11.9.5 厳密不等価演算子 (The Strict Does-not-equal Operator) ( !== ) 生成規則 EqualityExpression EqualityExpression !== RelationalExpression は、次のように評価される EqualityExpression を評価。 GetValue(Result(1)) を呼出す。 RelationalExpression を評価。 GetValue(Result(3)) を呼出す。 比較 Result(4) === Result(2) を行う。 (後述) Result(5) が true ならば、 false を返す。そうでなければ、 true を返す。 11.9.6 厳密等価比較アルゴリズム (The Strict Equality Comparison Algorithm) x と y を値として、比較 x === y は true または false を生成する。そのような比較は次のように行われる Type(x) が Type(y) と異なるならば、 false を返す。 Type(x) が Undefined ならば、 true を返す。 Type(x) が Null ならば、 true を返す。 Type(x) が Number でないならば、 ステップ 11 へ。 x が NaN ならば、 false を返す。 y が NaN ならば、 false を返す。 x が y と同じ数ならば、 true を返す。 x が +0 かつ y が -0 ならば、 true を返す。 x が -0 かつ y が +0 ならば、 true を返す。 false を返す。 Type(x) が String ならば、 x と y が厳密に同じ文字シーケンス (同じ長さで対応する位置が同じ文字) であるなら true を返す; そうでないならば、 false を返す。 If Type(x) が Boolean ならば、 x と y が共に true であるか、共に false であるなら true を返す; そうでないならば、 false を返す。 x と y が同じオブジェクトを参照しているならば、またそれらが互いに結合したオブジェクト (セクション 13.1.2) を参照しているならば、 true を返す。そうでないならば、 false を返す。 11.10 バイナリビット演算子 (Binary Bitwise Operators) Syntax BitwiseANDExpression EqualityExpression BitwiseANDExpression EqualityExpression BitwiseANDExpressionNoIn EqualityExpressionNoIn BitwiseANDExpressionNoIn EqualityExpressionNoIn BitwiseXORExpression BitwiseANDExpression BitwiseXORExpression ^ BitwiseANDExpression BitwiseXORExpressionNoIn BitwiseANDExpressionNoIn BitwiseXORExpressionNoIn ^ BitwiseANDExpressionNoIn BitwiseORExpression BitwiseXORExpression BitwiseORExpression | BitwiseXORExpression BitwiseORExpressionNoIn BitwiseXORExpressionNoIn BitwiseORExpressionNoIn | BitwiseXORExpressionNoIn Semantics @ のところを上の生成規則のビット演算子として、生成規則 A A @ B は、次のように評価される A を評価。 GetValue(Result(1)) を呼出す。 B を評価。 GetValue(Result(3)) を呼出す。 ToInt32(Result(2)) を呼出す。 ToInt32(Result(4)) を呼出す。 ビット演算子 @ を Result(5) と Result(6) に適用する。結果は符号付 32 ビット整数である。 Result(7) を返す。 11.11 バイナリ論理演算子 (Binary Logical Operators) Syntax LogicalANDExpression BitwiseORExpression LogicalANDExpression BitwiseORExpression LogicalANDExpressionNoIn BitwiseORExpressionNoIn LogicalANDExpressionNoIn BitwiseORExpressionNoIn LogicalORExpression LogicalANDExpression LogicalORExpression || LogicalANDExpression LogicalORExpressionNoIn LogicalANDExpressionNoIn LogicalORExpressionNoIn || LogicalANDExpressionNoIn Semantics 生成規則 LogicalANDExpression LogicalANDExpression BitwiseORExpression は、次のように評価される LogicalANDExpression を評価。 GetValue(Result(1)) を呼出す。 ToBoolean(Result(2)) を呼出す。 Result(3) が false ならば、 Result(2) を返す。 BitwiseORExpression を評価。 GetValue(Result(5)) を呼出す。 Result(6) を返す。 生成規則 LogicalORExpression LogicalORExpression || LogicalANDExpression は、次のように評価される LogicalORExpression を評価。 GetValue(Result(1)) を呼出す。 ToBoolean(Result(2)) を呼出す。 Result(3) が true ならば、 Result(2) を返す。 LogicalANDExpression を評価。 GetValue(Result(5)) を呼出す。 Result(6) を返す。 LogicalANDExpressionNoIn 生成規則と LogicalORExpressionNoIn 生成規則は、 LogicalANDExpression 生成規則と LogicalORExpression 生成規則と同様に評価されるが、内部の LogicalANDExpression, BitwiseORExpression, LogicalORExpression, の代わりに、それぞれ LogicalANDExpressionNoIn, BitwiseORExpressionNoIn, LogicalORExpressionNoIn が評価される。 NOTE 演算子、また || 演算子の生成する値が Boolean 型である必要はない。生成される値は常に、 2 個の項式のうちの 1 つの値である。. 11.12 条件演算子 (Conditional Operator) ( ? ) Syntax ConditionalExpression LogicalORExpression LogicalORExpression ? AssignmentExpression AssignmentExpression ConditionalExpressionNoIn LogicalORExpressionNoIn LogicalORExpressionNoIn ? AssignmentExpression AssignmentExpressionNoIn Semantics 生成規則 ConditionalExpression LogicalORExpression ? AssignmentExpression AssignmentExpression は、次のように評価される LogicalORExpression を評価。 GetValue(Result(1)) を呼出す。 ToBoolean(Result(2)) を呼出す。 Result(3) が false ならば、ステップ 8 へ。 最初の AssignmentExpression を評価。 GetValue(Result(5)) を呼出す。 Result(6) を返す。 2 番目の AssignmentExpression を評価。 GetValue(Result(8)) を呼出す。 Result(9) を返す。 ConditionalExpressionNoIn 生成規則は、 ConditionalExpression 生成規則と同様に評価されるが、内部の LogicalORExpression, 1 つ目の AssignmentExpression, 2 つ目の AssignmentExpression, の代わりに、それぞれ LogicalORExpressionNoIn, AssignmentExpression, AssignmentExpressionNoIn が評価される。 NOTE ECMAScript における ConditionalExpression の文法は、 C および JAVA とは若干異なり、 2 つ目の部分式が Expression であることをそれぞれ許可するが、 3 つ目の式が ConditionalExpression であることを制限する。 ECMAScript におけるこの差異は、 代入式がどちらの条件にも左右されることを許可し、混乱と中央式がカンマ式であるようなあまり意味のないケースを考慮しないことを動機としている。 11.13 代入演算子 (Assignment Operators) Syntax AssignmentExpression ConditionalExpression LeftHandSideExpression AssignmentOperator AssignmentExpression AssignmentExpressionNoIn ConditionalExpressionNoIn LeftHandSideExpression AssignmentOperator AssignmentExpressionNoIn AssignmentOperator one of = *= /= %= += -= = = = = ^= |= Semantics AssignmentExpressionNoIn 生成規則は、 AssignmentExpression と同様に評価されるが、 AssignmentExpression に含まれる ConditionalExpression と AssignmentExpression の代わりに ConditionalExpressionNoIn 及び AssignmentExpressionNoIn がそれぞれ評価される。 11.13.1 単純代入 (Simple Assignment) ( = ) 生成規則 AssignmentExpression LeftHandSideExpression = AssignmentExpression は、次のように評価される LeftHandSideExpression を評価。 AssignmentExpression を評価。 GetValue(Result(2)) を呼出す。 PutValue(Result(1), Result(3)) を呼出す。 Result(3) を返す。 11.13.2 複合代入 (Compound Assignment) ( op= ) @ のところは上に示した演算子の一つをあらわす生成規則 AssignmentExpression LeftHandSideExpression @ = AssignmentExpression は、次のように評価される LeftHandSideExpression を評価。 GetValue(Result(1)) を呼出す。 AssignmentExpression を評価。 GetValue(Result(3)) を呼出す。 Result(2) と Result(4) に、演算子 @ を適用する。 PutValue(Result(1), Result(5)) を呼出す。 Result(5) を返す。 11.14 カンマ演算子 (Comma Operator) ( , ) Syntax Expression AssignmentExpression Expression , AssignmentExpression ExpressionNoIn AssignmentExpressionNoIn ExpressionNoIn , AssignmentExpressionNoIn Semantics 生成規則 Expression Expression , AssignmentExpression は、次のように評価される Expression を評価。 GetValue(Result(1)) を呼出す。 AssignmentExpression を評価。 GetValue(Result(3)) を呼出す。 Result(4) を返す。 ExpressionNoIn 生成規則は、 Expression 生成規則と同様に評価されるが、 Expression と AssignmentExpression, の代わりに、それぞれ ExpressionNoIn と AssignmentExpressionNoIn が評価される。 文 (Statements) Syntax Statement Block VariableStatement EmptyStatement ExpressionStatement IfStatement IterationStatement ContinueStatement BreakStatement ReturnStatement WithStatement LabelledStatement SwitchStatement ThrowStatement TryStatement Semantics Statement は LabelledStatement の一部となりうるし、それ自身が LabelledStatement の一部であってもよく、以下同様である。この方法でつけられたラベルは、個々の文の意味論記述において "現在のラベルセット (current label set)" として併せて参照される。 LabelledStatement はラベルセットへのラベルの導入以外の意味論を持たない。 IterationStatement または SwitchStatement のラベルセットは最初は単一の要素 empty で構成される。任意の他の文のラベルセットは初期は empty である。 12.1 ブロック (Block) Syntax Block { StatementListopt } StatementList Statement StatementList Statement Semantics 生成規則 Block { } は、次のように評価される (normal, empty, empty) を返す。 生成規則 Block { StatementList } は、次のように評価される StatementList を評価。 Result(1) を返す。 生成規則 StatementList Statement は、次のように評価される Statement を評価。 例外が投げられたら、(throw, V, empty) を返す。 V は例外である。 (ここでは例外が返されないかのように実行は進行する。) Result(1) を返す。 生成規則 StatementList StatementList Statement は、次のように評価される StatementList を評価。 Result(1) が中途完了であれば、 Result(1) を返す。 Statement を評価。 例外が投げられたら、(throw, V, empty) を返す。 V は例外である。 (ここでは例外が返されないかのように実行は進行する。) Result(3).value が empty であれば、 V = Result(1).value とし、そうでなければ V = Result(3).value とする。 (Result(3).type, V, Result(3).target) を返す。 12.2 変数文 (Variable statement) Syntax VariableStatement var VariableDeclarationList ; VariableDeclarationList VariableDeclaration VariableDeclarationList , VariableDeclaration VariableDeclarationListNoIn VariableDeclarationNoIn VariableDeclarationListNoIn , VariableDeclarationNoIn VariableDeclaration Identifier Initialiseropt VariableDeclarationNoIn Identifier InitialiserNoInopt Initialiser = AssignmentExpression InitialiserNoIn = AssignmentExpressionNoIn Description FunctionDeclaration 内部で変数文が発生するならば、その変数は、セクション 10.1.3 にあるように、その関数内の関数ローカルスコープで定義される。そうでないならば、それらはプロパティ属性 { DontDelete } のグローバルスコープで定義される(つまり、セクション10.1.3 にあるグローバルオブジェクトのメンバとして作成される)。変数は実行スコープに入ったときに生成される。 Block は新しい実行スコープを定義しない。 Program と FunctionDeclaration だけが新しいスコープを生成する。生成時、変数は undefined で初期化される。イニシャライザを持つ変数が AssignmentExpression の値を代入されるのは VariableStatement が実行されるときであり、変数が生成されたときではない。 Semantics 生成規則 VariableStatement var VariableDeclarationList ; は、次のように評価される VariableDeclarationList を評価。 (normal, empty, empty) を返す。 生成規則 VariableDeclarationList VariableDeclaration は、次のように評価される VariableDeclaration を評価。 生成規則 VariableDeclarationList VariableDeclarationList , VariableDeclaration は、次のように評価される VariableDeclarationList を評価。 VariableDeclaration を評価。 生成規則 VariableDeclaration Identifier は、次のように評価される Identifier と同じ文字シーケンスで構成される文字列値を返す。 生成規則 VariableDeclaration Identifier Initialiser は、次のように評価される セクション 11.1.2 にあるように Identifier を評価。 Initialiser を評価。 GetValue(Result(2)) を呼出す。 PutValue(Result(1), Result(3)) を呼出す。 Identifier と同じ文字シーケンスで構成される文字列値を返す。 生成規則 Initialiser = AssignmentExpression は、次のように評価される AssignmentExpression を評価。 Result(1) を返す。 生成規則 VariableDeclarationListNoIn, VariableDeclarationNoIn, InitialiserNoIn は、生成規則 VariableDeclarationList, VariableDeclaration, Initialiser と同様に評価されるが、 VariableDeclarationList, VariableDeclaration, Initialiser, AssignmentExpression の代わりに、それぞれ VariableDeclarationListNoIn, VariableDeclarationNoIn, InitialiserNoIn, AssignmentExpressionNoIn が評価される。 12.3 空文 (Empty Statement) Syntax EmptyStatement ; Semantics 生成規則 EmptyStatement ; は、次のように評価される (normal, empty, empty) を返す。 12.4 式文 (Expression Statement) Syntax ExpressionStatement [lookahead ∉ {{, function} ] Expression ; Block と曖昧になることから、 ExpressionStatement は大括弧 "{" で開始することはできないことに注意。また、 FunctionDeclaration と曖昧になることから、 ExpressionStatement は function キーワードで開始することもできない。 Semantics 生成規則 ExpressionStatement [lookahead ∉ {{, function}] Expression ; は、次のように評価される Expression を評価する。 GetValue(Result(1)) を呼出す。 (normal, Result(2), empty) を返す。 12.5 if 文 (The if Statement) Syntax IfStatement if ( Expression ) Statement else Statement if ( Expression ) Statement 関連する if の選択が曖昧な else は、可能な限り最も近い、関連しなければ該当する else がないような if にそれぞれ関連している。 Semantics 生成規則 IfStatement if ( Expression ) Statement else Statement は、次のように評価される Expression を評価。 GetValue(Result(1)) を呼出す。 ToBoolean(Result(2)) を呼出す。 Result(3) が false ならば、ステップ 7 へ。 最初の Statement を評価。 Result(5) を返す。 2 番目の Statement を評価。 Result(7) を返す。 生成規則 IfStatement if ( Expression ) Statement は、次のように評価される Expression を評価。 GetValue(Result(1)) を呼出す。 ToBoolean(Result(2)) を呼出す。 Result(3) が false ならば、 (normal, empty, empty) を返す。 Result(3) が false ならば、 (normal, empty, empty) を返す。 Statement を評価。 Result(5) を返す。 12.6 繰返し文 (Iteration Statements) 繰返し文は (キーワードと括弧の制御構造で構成される) ヘッダと (Statement で構成される) 本文で構成される。 Syntax IterationStatement do Statement while ( Expression ); while ( Expression ) Statement for (ExpressionNoInopt; Expressionopt ; Expressionopt ) Statement for ( var VariableDeclarationListNoIn; Expressionopt ; Expressionopt ) Statement for ( LeftHandSideExpression in Expression ) Statement for ( var VariableDeclarationNoIn in Expression ) Statement 12.6.1 do-while 文 (The do-while Statement) 生成規則 do Statement while ( Expression ); は、次のように評価される V = empty とする。 Statement を評価。 Result(2).value が empty でなければ、 V = Result(2).value とする。 Result(2).type が continue で、かつ Result(2).target が現在のラベルセット内にあれば、ステップ 7 へ。 Result(2).type が break で、かつ Result(2).target が現在のラベルセット内にあれば、 (normal, V, empty) を返す。 Result(2) が中途完了ならば、 Result(2) を返す。 Expression を評価。 GetValue(Result(7)) を呼出す。 ToBoolean(Result(8)) を呼出す。 Result(9) が true ならば、ステップ 2 ヘ。 (normal, V, empty) を返す。 12.6.2 while 文 (The while statement) 生成規則 IterationStatement while ( Expression ) Statement は、次のように評価される V = empty とする。 Expression を評価。 GetValue(Result(2)) を呼出す。 ToBoolean(Result(3)) を呼出す。 Result(4) が false ならば、 (normal, V, empty) を返す。 Statement を評価。 Result(6).value が empty でなければ、 V = Result(6).value とする。 Result(6).type が continue かつ Result(6).target が現在のラベルセットならば、ステップ 2 へ。 Result(6).type が break かつ Result(6).target が現在のラベルセットならば、 (normal, V, empty) を返す。 Result(6) が中途完了ならば、 Result(6) を返す。 ステップ 2 へ。 12.6.3 for 文 (The for Statement) 生成規則 IterationStatement for (ExpressionNoInopt ; Expressionopt ; Expressionopt) Statement は、次のように評価される ExpressionNoIn が存在しなければ、ステップ 4 へ。 ExpressionNoIn を評価。 GetValue(Result(2)) を呼出す。 (この値は使用しない。) V = empty とする。 最初の Expression が存在しなければ、ステップ 10 へ。 最初の Expression を評価。 GetValue(Result(6)) を呼出す。 ToBoolean(Result(7)) を呼出す。 Result(8) が false ならば、ステップ 19 へ。 Statement を評価。 Result(10).value が empty でないならば、 V = Result(10).value とする。 Result(10).type が break かつ Result(10).target が現在のラベルセットならば、ステップ 19 へ。 Result(10).type が continue かつ Result(10).target が現在のラベルセットならば、ステップ 15 へ。 Result(10) が中途完了ならば Result(10) を返す。 2 番目の Expression が存在しなければ、ステップ 5 へ。 2 番目の Expression を評価。 GetValue(Result(16) を呼出す。 (この値は使用しない。) ステップ 5 へ。 (normal, V, empty) を返す。 生成規則 IterationStatement for ( var VariableDeclarationListNoIn ; Expressionopt ; Expressionopt ) Statement は、次のように評価される VariableDeclarationListNoIn を評価。 V = empty とする。 1 個目の Expression が存在しないならば、 ステップ 8 へ。 1 個目の Expression を評価。 GetValue(Result(4)) を呼出す。 ToBoolean(Result(5)) を呼出す。 Result(6) が false ならば、 ステップ 17 へ。 Statement を評価。 Result(8).value が空でないならば、 V = Result(8).value とする。 Result(8).type が break かつ Result(8).target が現在のラベルセット内ならば、 ステップ 17 へ。 Result(8).type が continue かつ Result(8).target が現在のラベルセット内ならば、 ステップ 13 へ。 Result(8) が中途完了ならば、 Result(8) を返す。 2 個目の Expression が存在しないならば、 ステップ 3 へ。 2 個目の Expression を評価。 GetValue(Result(14)) を呼出す。 (この値は使用しない。) ステップ 3 へ。 (normal, V, empty) を返す。 12.6.4 for-in 文 (The for-in Statement) 生成規則 IterationStatement for ( LeftHandSideExpression in Expression ) Statement は、次のように評価される Expression を評価。 GetValue(Result(1)) を呼出す。 ToObject(Result(2)) を呼出す。 V = empty とする。 DontEnum 属性を持たない、 Result(3) の次のプロパティの名前を取得する。そのようなプロパティが存在しないならば、 ステップ 14 へ。 LeftHandSideExpression を評価 (これは繰返し評価されてよい)。 PutValue(Result(6), Result(5)) を呼出す。 Statement を評価。 Result(8).value が empty でないならば、 V = Result(8).value とする。 Result(8).type が break かつ Result(8).target が現在のラベルセット内ならば、 ステップ 14 へ。 Result(8).type が continue かつ Result(8).target が現在のラベルセット内ならば、 ステップ 5 へ。 Result(8) が中途完了ならば、 Result(8) を返す。 ステップ 5 へ。 (normal, V, empty) を返す。 生成規則 IterationStatement for ( var VariableDeclarationNoIn in Expression ) Statement は、次のように評価される VariableDeclarationNoIn を評価。 Expression を評価。 GetValue(Result(2)) を呼出す。 ToObject(Result(3)) を呼出す。 V = empty とする。 DontEnum 属性を持たない、 Result(4) の次のプロパティを取得する。そのようなプロパティが存在しないならば、ステップ 15 へ。 それが Identifier であるかのように Result(1) を評価; 11.1.2 参照(これは繰返し評価されてよい). PutValue(Result(7), Result(6)) を呼出す。 Statement を評価。 Result(9).value が empty でないならば、 V = Result(9).value とする。 Result(9).type が break かつ Result(9).target が現在のラベルセット内ならば、 ステップ 15 へ。 Result(9).type が continue かつ Result(9).target が現在のラベルセット内ならば、 ステップ 6 へ。 Result(8) が中途完了ならば、 Result(8) を返す。 ステップ 6 へ。 (normal, V, empty) を返す。 プロパティの列挙方法 (1 個目のアルゴリズムのステップ 5, 2 個目のステップ 6) は実装依存である。列挙の順序はオブジェクトにより定義される。列挙されているオブジェクトのプロパティは列挙中に削除されてもよい。列挙中まだ挙げられていないプロパティが削除されるならば、そのプロパティは列挙されない。列挙中オブジェクトに新しいプロパティが追加されるならば、新たに追加されたプロパティは現在の列挙において挙げられることを保証されない。 オブジェクトのプロパティ列挙は、そのプロトタイプのプロパティ、プロトタイプのプロトタイプのプロパティ、以下同様に再帰的にプロパティを含む; しかし、同名のプロパティを持つプロトタイプチェーン内の前のオブジェクトにより "隠される" ならば、プロトタイプのプロパティは列挙されない。 12.7 continue 文 (The continue Statement) Syntax ContinueStatement continue [LineTerminator 無し] Identifieropt ; Semantics 次のいずれかが真であるとき、プログラムは構文的に不正であると考えられる プログラムが選択的 Identifier を持たない continue 宣言で構成されていて、直接または間接的に(関数の区切りにまたがらない)、 IterationStatement 内にネストしなていない。 プログラムが選択的 Identifier を持つ continue 宣言で構成されていて、閉じた (関数の区切りにはまたがらない) IterationStatement のラベルセット内に Identifier が出現しない Identifier のない ContinueStatement は、次のように評価される (continue, empty, empty) を返す。 Identifier を持つ ContinueStatement は、次のように評価される (continue, empty, Identifier) を返す。 12.8 break 文 (The break Statement) Syntax BreakStatement break [LineTerminator 無し] Identifieropt ; Semantics 次のいずれかが真である場合、プログラムは構文的に不正であると考えられる プログラムが選択的な Identifier を持たない break 文を含み、それが IterationStatement または SwitchStatement 内部で直接的または間接的にネストしていない。 (関数の境界には交わらない) プログラムが選択的な Identifier を持つ break 文を含み、 Identifier が Statement を囲むラベルセット内に出現しない。 (関数の境界には交わらない) Identifier のない BreakStatement は、次のように評価される (break, empty, empty) を返す。 Identifier のある BreakStatement は、次のように評価される (break, empty, Identifier) を返す。 12.9 return 文 (The return Statement) Syntax ReturnStatement return [LineTerminator 無し] Expressionopt ; Semantics ECMAScript プログラムは、それが FunctionBody 内部\でない return 文を含む場合、構文的に不正と考えられる。return 文は、関数に実行を停止させ、値を呼出側に返させる。 Expression が省略される場合、戻り値は undefined である。そうでなければ、戻り値は Expression の値である。 生成規則 ReturnStatement return [no LineTerminator here] Expressionopt ; は、次のように評価される Expression が存在しなければ (return, undefined, empty) を返す。 Expression を評価。 GetValue(Result(2)) を呼出す。 (return, Result(3), empty) を返す。
https://w.atwiki.jp/hira-struts11/pages/14.html
struts1.1/action.ActionServlet ソースコード ActionServlet.java - jakarta-struts-1.1-src/src/share/org/apache/struts/action - Code Search リスト init()
https://w.atwiki.jp/javadsge/pages/8550.html
var x=new Array(); var y=new Array(); var p=new Array(); var koma=new Array(); var namex=new Array(); var dx=new Array(); var dy=new Array(); var number_koma=new Array(); function myFunction() { x[1]=2; y[1]=1; p[1]=1; x[2]=2; y[2]=3; p[2]=2; koma[1]=1; koma[2]=1; namex[1]="王"; id="1aPGk98JxsexKKOm_Ypl_EX3RA-Qs-599VuD-7c-jvvg"; var ex = SpreadsheetApp.openById(id); var sh = ex.getSheetByName("data"); for(s=1;s 3;s++){ sx=koma[s]; sh.getRange(y[s],x[s]).setValue(namex[sx]); } for(s=1;s 2;s++){ dx[s]=new Array(); dy[s]=new Array(); } number_koma[1]=8; dx[1][1]=1; dy[1][1]=0; dx[1][2]=0; dy[1][2]=1; dx[1][3]=0; dy[1][3]=-1; dx[1][4]=-1; dy[1][4]=0; dx[1][5]=1; dy[1][5]=-1; dx[1][6]=-1; dy[1][6]=1; dx[1][7]=1; dy[1][7]=1; dx[1][8]=-1; dy[1][8]=-1; select(2); } function select(sp){ k1=koma[sp]; var s,sx; var ax=new Array(); var ay=new Array(); sx=0; for(s=1;s number_koma[k1]+1;s++){ x2=x[sp]+dx[k1][s]; y2=y[sp]+dy[k1][s]; h=0; if(x2 3)h=100; if(x2 1)h=100; if(y2 3)h=100; if(y2 1)h=100; if(h 50)sx=sx+1; if(h 50)ax[sx]=x2; if(h 50)ay[sx]=y2; } number_sub=sx; Logger.log(number_sub); }
https://w.atwiki.jp/usb_audio/pages/52.html
原文:Audio Device Document 1.0(PDF) USB Device Class Definition for Audio Devices Release 1.0 March 18, 1998 116 Offset Field Size Value Description 5 bDeviceSubClass 1 0x00 Unused. 6 bDeviceProtocol 1 0x00 Unused. 7 bMaxPacketSize0 1 0x08 8 bytes. 8 idVendor 2 0xXXXX Vendor ID. 10 idProduct 2 0xXXXX Product ID. 12 bcdDevice 2 0xXXXX Device Release Code. 14 iManufacturer 1 0x01 Index to string descriptor that contains the string Your Name in Unicode. 15 iProduct 1 0x02 Index to string descriptor that contains the string Your Product Name in Unicode. 16 iSerialNumber 1 0x00 Unused. 17 bNumConfiguration s 1 0x01 One configuration. C.3.2 Configuration Descriptor Table C-2 USB Telephone Configuration Descriptor Offset Field Size Value Description 0 bLength 1 0x09 Size of this descriptor, in bytes. 1 bDescriptorType 1 0x02 CONFIGURATION descriptor. 2 wTotalLength 2 0x00XX Length of the total configuration block, including this descriptor, in bytes. 4 bNumInterfaces 1 0x03 Three interfaces 5 bConfigurationValue 1 0x01 ID of this configuration 6 iConfiguration 1 0x00 Unused. 7 bmAttributes 1 0x60 Self Powered Remote Wakeup capable. 8 MaxPower 1 0x00 Not applicable. C.3.3 AudioControl Interface Descriptor The AudioControl interface describes the device structure and is used to manipulate the Audio Controls. USB Device Class Definition for Audio Devices Release 1.0 March 18, 1998 117 C.3.3.1 Standard AC Interface Descriptor The AudioControl interface has no dedicated endpoints associated with it. It uses the default pipe (endpoint 0) for all communication purposes. Class-specific AudioControl Requests are sent using the default pipe. There is no Status Interrupt endpoint provided. Table C-3 USB Telephone Standard AC Interface Descriptor Offset Field Size Value Description 0 bLength 1 0x09 Size of this descriptor, in bytes. 1 bDescriptorType 1 0x04 INTERFACE descriptor. 2 bInterfaceNumber 1 0x00 Index of this interface. 3 bAlternateSetting 1 0x00 Index of this setting. 4 bNumEndpoints 1 0x00 0 endpoints. 5 bInterfaceClass 1 0x01 AUDIO. 6 bInterfaceSubclass 1 0x01 AUDIO_CONTROL. 7 bInterfaceProtocol 1 0x00 Unused. 8 iInterface 1 0x00 Unused. C.3.3.2 Class-specific Interface Descriptor The Class-specific AC interface descriptor is always headed by a Header descriptor that contains general information about the AudioControl interface. It contains all the pointers needed to describe the Audio Interface Collection, associated with the described audio function. Table C-4 USB Telephone Class-specific Interface Descriptor Offset Field Size Value Description 0 bLength 1 0x0A Size of this descriptor, in bytes. 1 bDescriptorType 1 0x24 CS_INTERFACE. 2 bDescriptorSubtype 1 0x01 HEADER subtype. 3 bcdADC 2 0x0100 Revision of class specification - 1.0 5 wTotalLength 2 0x0064 Total size of class specific descriptors. 7 bInCollection 1 0x02 Number of streaming interfaces 8 baInterfaceNr(1) 1 0x01 AudioStreaming interface 1 belongs to this AudioControl interface. 9 BaInterfaceNr(2) 1 0x02 AudioStreaming interface 2 belongs to this AudioControl interface. USB Device Class Definition for Audio Devices Release 1.0 March 18, 1998 118 C.3.3.3 Input Terminal Descriptor (ID1) This descriptor describes the Input Terminal that represents the analog telephone line input. The audio channel cluster on the single Output Pin contains a single logical channel (bNrChannels=1) and there is no spatial location associated with this mono channel (wChannelConfig=0x0000). This is the input part of a bi-directional Terminal and therefore has an associated Output Terminal (ID4). Table C-5 USB Telephone Input Terminal Descriptor (ID1) Offset Field Size Value Description 0 bLength 1 0x0C Size of this descriptor, in bytes. 1 bDescriptorType 1 0x24 CS_INTERFACE. 2 bDescriptorSubtype 1 0x02 INPUT_TERMINAL subtype. 3 bTerminalID 1 0x01 ID of this Terminal. 4 wTerminalType 2 0x0501 Terminal is Phone Line In. 6 bAssocTerminal 1 0x04 Associated with Phone Line Out Terminal. 7 bNrChannels 1 0x01 One channel. 8 wChannelConfig 2 0x0000 Mono sets no position bits. 10 iChannelNames 1 0x00 Unused. 11 iTerminal 1 0x00 Unused. C.3.3.4 Input Terminal Descriptor (ID2) This descriptor describes the telephone handset input microphone. The audio channel cluster on the single Output Pin contains a single logical channel (bNrChannels=1) and there is no spatial location associated with this mono channel (wChannelConfig=0x0000). This is the input part of a bi-directional Terminal and therefore has an associated Output Terminal (ID5). Table C-6 USB Telephone Input Terminal Descriptor (ID2) Offset Field Size Value Description 0 bLength 1 0x0C Size of this descriptor, in bytes. 1 bDescriptorType 1 0x24 CS_INTERFACE. 2 bDescriptorSubtype 1 0x02 INPUT_TERMINAL subtype. 3 bTerminalID 1 0x02 ID of this Terminal. 4 wTerminalType 2 0x0401 Terminal is Handset In. 6 bAssocTerminal 1 0x05 Associated with Handset Out Terminal. USB Device Class Definition for Audio Devices Release 1.0 March 18, 1998 119 Offset Field Size Value Description 7 bNrChannels 1 0x01 One channel. 8 wChannelConfig 2 0x0000 Mono sets no position bits. 10 iChannelNames 1 0x00 Unused. 11 iTerminal 1 0x04 Unused. C.3.3.5 Input Terminal Descriptor (ID3) This descriptor describes the USB stream from the Host to the telephone set. The audio channel cluster on the single Output Pin contains a single logical channel (bNrChannels=1) and there is no spatial location associated with this mono channel (wChannelConfig=0x0000). This is the input part of a bi-directional Terminal and therefore has an associated Output Terminal (ID6). Table C-7 USB Telephone Input Terminal Descriptor (ID3) Offset Field Size Value Description 0 bLength 1 0x0C Size of this descriptor, in bytes. 1 bDescriptorType 1 0x24 CS_INTERFACE. 2 bDescriptorSubtype 1 0x02 INPUT_TERMINAL subtype. 3 bTerminalID 1 0x03 ID of this Terminal. 4 wTerminalType 2 0x0101 Terminal is USB Streaming In. 6 bAssocTerminal 1 0x06 Associated with USB Streaming out Terminal. 7 bNrChannels 1 0x01 One channel. 8 wChannelConfig 2 0x0000 Mono sets no position bits. 10 iChannelNames 1 0x00 Unused. 11 iTerminal 1 0x05 Unused. C.3.3.6 Output Terminal Descriptor (ID4) This descriptor describes the Output Terminal that represents the analog telephone line output. The audio channel cluster on the single Input Pin contains a single logical channel. This is the output part of a bi-directional Terminal and therefore has an associated Input Terminal (ID1). Table C-8 USB Telephone Output Terminal Descriptor (ID4) Offset Field Size Value Description 0 bLength 1 0x09 Size of this descriptor, in bytes. USB Device Class Definition for Audio Devices Release 1.0 March 18, 1998 120 Offset Field Size Value Description 1 bDescriptorType 1 0x24 CS_INTERFACE. 2 bDescriptorSubtype 1 0x03 OUTPUT_TERMINAL subtype. 3 bTerminalID 1 0x04 ID of this Terminal. 4 wTerminalType 2 0x0501 Terminal is Phone Line Out. 6 bAssocTerminal 1 0x01 Associated with Phone Line In Terminal. 7 bSourceID 1 0x07 From Phone Line Selector Unit. 8 iTerminal 1 0x06 Unused. C.3.3.7 Output Terminal Descriptor (ID5) This descriptor describes the telephone handset output earpiece. The audio channel cluster on the single Input Pin contains a single logical channel. This is the output part of a bi-directional Terminal and therefore has an associated Input Terminal (ID2). Table C-9 USB Telephone Output Terminal Descriptor (ID5) Offset Field Size Value Description 0 bLength 1 0x09 Size of this descriptor, in bytes. 1 bDescriptorType 1 0x24 CS_INTERFACE. 2 bDescriptorSubtype 1 0x03 OUTPUT_TERMINAL subtype. 3 bTerminalID 1 0x05 ID of this Terminal. 4 wTerminalType 2 0x0401 Terminal is Handset Out. 6 bAssocTerminal 1 0x01 Associated with Handset In Terminal. 7 bSourceID 1 0x08 From Handset Selector Unit. 8 iTerminal 1 0x00 Unused. C.3.3.8 Output Terminal Descriptor (ID6) This descriptor describes the USB stream from the telephone set to the Host. The audio channel cluster on the single Input Pin contains a single logical channel. This is the output part of a bi-directional Terminal and therefore has an associated Input Terminal (ID3). Table C-10 USB Telephone Output Terminal Descriptor (ID6) Offset Field Size Value Description 0 bLength 1 0x09 Size of this descriptor, in bytes. 1 - 6 - 11 - 16 - 21 - 26 - 31 - 36 - 41 - 46 - 51 - 56 - 61 - 66 - 71 - 76 - 81 - 86 - 91 - 96 - 101 - 106 - 111 - 116 - 121 - 126 ここを編集
https://w.atwiki.jp/atachi/pages/56.html
COMポートの制御方法一覧 [#p7cc401c] C#によるCOMポートの制御方法 [#cf3722e4] バイナリデータの入出力 [#vc23ef70] 非同期通信 [#ra977492] 文字列エンコーディング [#mf511404] 送受信のタイミング [#e9a806a9] .NET Frameworks2以降でシリアルポートがサポートされています。 SerialPortはSystem.IO.Portsに所属します。 WindowsFormプロジェクトでは、SerialPortコントロールがコンポーネントとして使用できます。 WPFではコントロールとしては存在しませんので、System.IO.Ports.SerialPortクラスのインスタンスをソースコード上で作成して使用します。 COMポートの制御方法一覧 ポートの列挙 string[] ports = SerialPort.GetPortNames(); C#によるCOMポートの制御方法 US-ASCIIをポートの入出力にする場合、WriteLine/ReadLineを使用できます。 // 【ポートのオープン】 // 「COM1」というCOMポートがシステムに存在しているものとする SerialPort port = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One); port.Open(); port.DtrEnable = true; port.RtsEnable = true; // 【ポートへの書き込み】 port.WriteLine("Hello"); // WriteLineでは、指定した文字列の末尾に // 自動的に改行コード(※1)が追加される // 【ポートからの読み込み】 string read = port.ReadLine(); // ReadLineでは、文字列をポートから読み込む。 // ポートからのデータに、改行コードを検出すると、 // 改行コード(※1)を削除したものを返値する。 // 【ポートのクローズ】 port.Close(); // ※1 改行コードは「CLRF = 0x0d 0x0a」(2バイト) ちなみに、SerialPortクラスはIDisposableインターフェースを提供しているので、C#の流儀に従うなら次のように記述するほうが安全。 using(SerialPort port = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One) ) { port.Open(); }// port.Close()は不要 バイナリデータの入出力 SerialPort.Read または SerialPort.Write を使用してバイナリデータの入出力ができます。 非同期通信 イベントを使うことでポートにデータが到達した場合にリスナーハンドラを呼び出すことができます。 // portはSerialPortオブジェクト port.DataReceived += new SerialDataReceivedEventHandler(OnSerialDataReceived); void OnSerialDataReceived(object sender,SerialDataReceivedEventArgs e) { // 受信時の処理 SerialPort s = sender as SerialPort; } 文字列エンコーディング COMポートから日本語を受け取ることもできます。 C#では文字列をstring型として扱い、この型にはエンコード情報が含まれているため、C#では複数のエンコードを1つの型で表現できるのです。 COMポートから送られてくる日本語のエンコード形式を指定することで、SerialPort.ReadLine()は適切なエンコード処理を行い、string型を返すことができるのです。 // portはSerialPortオブジェクト port.Encoding = Encoding.GetEncoding("Shift_JIS"); // ReadLineで取得する文字列のエンコード形式がShiftJISであることを指 送受信のタイミング SerialPortのメソッドを使用している限り、そのメソッドを呼び出した直後にポートによりデータが送受信されます。 ただし、送受信に失敗するケースがあります。ハンドシェークを使用してCOMポートを制御している場合に、デバイスが準備できていないことを検出するなどの原因で直ちに送受信が行えないなどです。 このような場合、SerialPort.ReadやSerialPort.Writeは例外をスローします。
https://w.atwiki.jp/bgmfes/pages/40.html
関係者 B.G.M Festival(美郷あきオフィシャルブログ) B.G.M Festival Vol.0(yozucamera*) BGMフェス Vol.0(ゆりあぶろぐ) Burst dream ! 後ろに夢なんかない(えんちゃんねる) B.G.M(AiRIのブログ) B.G.M. fes Vol.0ありがとう!!!(モモブロ) B.G.M festival/続・B.G.M FESTIVAL/続々B.G.M Festival(メジャー・オア・アンダーグラウンド) プレス 桃井はるこ、佐藤ひろ美らが熱唱!『B.G.Mフェスティバル Vol.0』レポート!(じゃぽかる) 参加者 「B.G.M Festival Vol.0」レポ #bgm_fes(Dolphan日記帳) B.G.M Festival Vol.0@品川ステラボール(無限迷路) B.G.M Festival Vol.0(おもてのガラクタ日記) B.G.M Festival Vol.0(ひとりこすりんぴっく) 「B.G.M Festival Vol.0」感想(あっち向いてこっち向いて) B.G.M Festival vol.0(Tightrope Dancer) B.G.M Festival Vol.0(みづなきそら) B.G.M Festival Vol.0(アニソンとパソゲーとその他モロモロ) B.G.M Festival Vol.0 感想(かねぴ~の自堕落日記) 「B.G.M Festival Vol.0」ライブレポート。美少女ゲーム好きとして初心に戻れました!(MA-SAブログ) B.G.M Festival Vol.0(青空の下で) B.G.M Festival Vol.0とかエウくじとかサンクリとか(みちょー牧場) B.G.M Festival Vol.0(The hymn to dream) B.G.M Festival Vol.0 無事終了おめでとう!(Azure) B.G.M Festivalお疲れ様でしたー(二次嫁に賛辞を) B.G.M Festival Vol.0 レポ(徹夜会会長の脳内World) B.G.M.Festival vol.0に参加してきました(amamistの日記) B.G.M Festival Vol.0 ~そして伝説へ~(萃-sui-) BGMフェス(ハニワ亭) B.G.M.フェスVol.0 ニコ生 でみたよ(どどどの日誌) B.G.M Festival Vol.0(2次元とコーラと俺)
https://w.atwiki.jp/cohstatsjp/pages/299.html
Vehicle Panzer Elite Goliath Contents 1 Tactics 2 History 3 Built From 3.1 Funkwagen Vampire Halftrack 4 Vehicle Abilities 4.1 Goliath Camouflage 4.2 Detonate the Goliath 5 Vehicle Weapons 5.1 Goliath Weapon Panzer Elite Goliath Health 85 Max Speed 5.5 Sight 25 Cost 125 Acceleration 8 Detection 0/0 Time 8 Deceleration 12 Hotkey G Population 0 Rotation 45 Target Type vehicle_motorcycle Upkeep 1.344 Crush Human Critical Type goliath Crush Mode Rear Damage Enabled false Tactics On certain maps, it can be a wise decision to destroy bridges in order to focus your and your enemy s troops into a single front. Goliaths are perfect for destroying both small wooden bridges and the larger concrete ones (Goliaths have no effect against land bridges however). Placing a Goliath in medium or heavy cover will camouflage it completely. When the time is right, detonate the goliath and destroy large portions of an enemy force in one click. This tactic is best used on narrow bridges or in confined spaces. Unlike their Wehrmacht counterparts, the Panzer Elite must deploy their Goliaths from the Funkwagen Vampire Halftrack. Drive in, make the drop and get out, as this little halftrack is extremely weak when unsupported. History For the purposes of delivering demolition charges to a target remotely various projects were started, and from them, the Goliath emerged. Meant to be utilized by Pioneers when attacking static emplacements, the Goliath was a remote-controlled demolition carrier guided by a wired controller. Though the small gas-powered vehicle carried enough explosives to knock out most fortifications in one blast, rough terrain posed a problem for it. The wire often got snagged and caught on bushes, branches, and rocks, and wouldn t have the horsepower to free itself from some obstacles. Its larger and more successful cousin, the Borgward BIV, was a demolition tank that was radio-controlled from a StuG III G, or Tiger I E. The Goliath tracked mine was an unmanned German-engineered demolition vehicle. Employed by the Wehrmacht during World War II, this caterpillar-tracked vehicle was approximately four feet long, two feet wide, and one foot tall. It carried 75 to 100 kg (165 E20 lb) of high explosives and was intended to be used for multiple purposes, such as destroying tanks, disrupting dense infantry formations, and the demolition of buildings. In late 1940, after recovering the prototype of a miniature tracked vehicle developed by the French vehicle designer Adolphe Kégresse from the Seine River, the Wehrmacht s ordnance office tasked the Carl F.W. Borgward automotive company of Bremen, Germany to develop a similar vehicle for the purpose of carrying a minimum of 50 kg of explosives. The result was the SdKfz. 302 (Sonderkraftfahrzeug, Epecial-purpose vehicle E, called the Leichter Ladungsträger (‘light charge carrier E, or Goliath, which carried 60 kg of explosives. The vehicle was steered remotely via a joystick control box, which itself was attached to the Goliath by a triple-strand telephone cable connected to the rear of the vehicle. Each Goliath was disposable, as it was intended for the vehicle to be blown up along with its target. Early model Goliaths used an electric motor, but as these were costly to make (approximately 300 Reichmarks) and difficult to repair in a combat environment, later models (known as the SdKfz. 303) used a simpler, more reliable gasoline engine. Goliaths were used on all fronts where the Wehrmacht fought, with their first action beginning in the spring 1942. They were used principally by specialized Panzer and combat engineer units. Goliaths were used most notoriously in the Warsaw Uprising of 1944, as Wehrmacht and SS units were deployed to crush the fierce Polish resistance by the Polish Home Army (Armia Krajowa). As the Poles had only a small number of antitank weapons, volunteers were often sent to cut off the command cables of the Goliath before it reached its intended target. A few Goliaths were also seen on the beaches of Normandy during D-Day, though most were rendered inoperative due to artillery blasts, which severed their command cables. Although a total of 7,564 Goliaths were produced, the single use weapon was not considered a success due to the high unit cost, low speed (only just above 6 mph, or 9.5 km/h), poor ground clearance (just 11.4 centimeters), vulnerable command cables and thin armour which failed to protect the remote bomb from any form of antitank weapons. However, the Goliath did help lay the foundation for post-World-War-Two advances in remote-controlled vehicle technologies.[citation needed] Surviving Goliaths are preserved at the United States Army Ordnance Museum, the Bovington Tank Museum in the UK, and the Deutsches Panzermuseum in Germany. Built From Funkwagen Vampire Halftrack [Expand][Hide] Health 285 Population 4 Cost 220 Max Speed 6.5 Time 45 Target Type vehicle_22x Hotkey V Effects Powerful radios equip the 250/3 Funkwagen Vampire enabling it to interdict enemy signals and disrupt their supply lines. This vehicle siphons resources away from enemy sectors that it sets up in. It has no weaponry of its own, so must be supported when in enemy territory. ESee Vehicle Funkwagen Vampire Halftrack for details. Vehicle Abilities Goliath Camouflage [Expand][Hide] Cost Activation always_on Duration _ Target tp_any Recharge 0 Hotkey Effects $0 no key ESee Ability Goliath Camouflage for details. Detonate the Goliath [Expand][Hide] Cost Activation timed Duration _ Target tp_any Recharge 10 Hotkey D Effects Goliaths are remote controlled Tanks packed with Explosives. ESee Ability Detonate the Goliath for details. Vehicle Weapons Goliath Weapon [Expand][Hide] Weapon Goliath Weapon See Weapon Goliath Weapon for details. Retrieved from http //coh-stats.com/Vehicle Panzer_Elite_Goliath
https://w.atwiki.jp/wnt0/pages/29.html
#include iostream using namespace std; class Product { public void Operation() { cout "Product." endl; } }; class FactoryImple { public virtual Product* FactoryMethod() { return new Product; } }; class Factory { public Factory(FactoryImple *factory) { m_factory = factory; m_prod = NULL; } ~Factory() { if (m_prod != NULL) { delete m_prod; cout "Product deleted." endl; } } virtual Product* CreateProduct() { Product *prod = m_factory- FactoryMethod(); m_prod = prod;// 何回も呼ばれるときの対応が必要 return prod; } private FactoryImple *m_factory; Product *m_prod; }; int main() { FactoryImple *fac_imple = new FactoryImple; Factory *factory = new Factory(fac_imple); Product *prod = factory- CreateProduct(); prod- Operation(); delete fac_imple; delete factory;// ここで prod も delete される return 0; } 参考サイト デザインパターンを“喩え話”で分かり易く理解する http //www.netlaputa.ne.jp/~hijk/study/oo/designpattern.html TECHSCORE http //www.techscore.com/tech/DesignPattern/index.html/ Programing Place http //www.geocities.jp/ky_webid/index_old.html デザインパターンの骸骨たち http //www002.upp.so-net.ne.jp/ys_oota/mdp/
https://w.atwiki.jp/visualstudio/pages/36.html
C#3.0ではLINQが追加されました。 それに伴い、LINQの可読性を上げるための機能もC#3.0には追加されています。 目次 暗黙的に型指定されたローカル変数 暗黙的に型指定された配列 オブジェクト初期化子 コレクション初期化子 自動プロパティ 匿名型 拡張メソッド ラムダ式 LINQ 暗黙的に型指定されたローカル変数 明示的に型を指定することなく、ローカル変数を宣言することができようになった varキーワードを使用する コンパイル時に適切な型が割り当たる フィールドでは使用不可 VB6のVariantと異なり、変数宣言時に初期化が必要 VB6のVariantと異なり、型変換は出来ない 型名の冗長さを省く場合や、匿名型を使用した場合に用いる class Program { //フィールドでは使用不可 //var a = 123; static void Main(string[] args) { var i = 123; var d = 12.3M; var str = "abc"; var dt = DateTime.Now; //変数宣言時に初期化が必要 //var b; //型変換は出来ない //i = "abc"; //型の冗長さを省く場合 var obj1 = new Myclass(); //匿名型を使用した場合 var obj2 = new { Name = "abc" }; } } class Myclass { } 暗黙的に型指定された配列 newで配列を作成する際、newの後ろの型が省略可能となった コンパイル時に{} の中身から適切な型が割り当たる 複数の型が含まれる場合、コンパイルエラーとなる class Program { static void Main(string[] args) { var i = new[] { 1, 2, 3, }; var d = new[] { 1.1, 2.2, 3.3 }; var str = new[] { "abc", "def", "ghi" }; //複数の型が含まれる場合、コンパイルエラーとなる //var obj = new[] { 1, "abc", 2 }; //匿名型を使用した場合 var persons = new[]{ new{Name = "Taro",Age = 20}, new{Name = "Jiro",Age = 18} }; } } オブジェクト初期化子 オブジェクトの初期化が簡潔に記述可能となった 中カッコ{ }内で初期化を行う class Program { static void Main(string[] args) { //C#3.0の場合 var person3 = new Person { Age = 20, Name = "Taro" }; //C#2.0の場合 Person person2 = new Person(); person2.Age = 20; person2.Name = "Taro"; } } class Person { public string m_name; public int m_age; public string Name { get { return m_name; } set { m_name = value; } } public int Age { get { return m_age; } set { m_age = value; } } } コレクション初期化子 コレクションの初期化が簡潔に記述可能となった 中カッコ{ }内で初期化を行う class Program { static void Main(string[] args) { //C#3.0の場合 var list3 = new List int { 1, 2, 3 }; var dic3 = new Dictionary string, int () { { "a", 1 }, { "b", 2 }, { "c", 3 } }; //C#2.0の場合 List int list2 = new List int (); list2.Add(1); list2.Add(2); list2.Add(3); Dictionary string, int dic2 = new Dictionary string, int (); dic2.Add("a", 1); dic2.Add("b", 2); dic2.Add("c", 3); } } 自動プロパティ プロパティの記述が簡潔に記述可能となった コンパイル時、従来のプロパティが自動的に生成される get、set 両方を記述する必要がある 読み取り専用のプロパティを作成するには、プライベートな set を用意する class Person { public string Name { get; set; } } 上記クラスをコンパイルしReflector for.NETを使用し生成ファイルを見ると、以下のフィールド、プロパティが自動生成されていることがわかる internal class Person { // Fields private string Name k__BackingField; // Properties public string Name { get { return this. Name k__BackingField; } set { this. Name k__BackingField = value; } } } 匿名型 クラスを別途定義せずにオブジェクト生成が可能となった 匿名型は、プログラマからはクラス名が不明のためvarキーワードを使用する コンパイル時、クラスが自動的に作成される 同じ名前、同じ型、同じ並び順のプロパティを持つ匿名型は同一のクラスとなる 主にLINQのselect旬で使用される機能 class Program { static void Main(string[] args) { var obj1 = new { Name = "Taro", Age = 20 }; var obj2 = new { Name = "Jiro", Age = 18 }; if (obj1.GetType() == obj2.GetType()) { Console.WriteLine("同じ型"); } } } 上記クラスをコンパイルしReflector for.NETを使用し生成ファイルを見ると、以下のクラスが自動生成されていることがわかる internal sealed class f__AnonymousType0 Name j__TPar, Age j__TPar { // Fields private readonly Age j__TPar Age i__Field; private readonly Name j__TPar Name i__Field; // Methods public f__AnonymousType0( Name j__TPar Name, Age j__TPar Age) { this. Name i__Field = Name; this. Age i__Field = Age; } // Properties public Age j__TPar Age { get { return this. Age i__Field; } } public Name j__TPar Name { get { return this. Name i__Field; } } } 拡張メソッド 既存クラスを継承することなく、既存クラスにインスタンスメソッドを追加出来る機能 非ジェネリックのstaticクラス内にてstaticメソッドで宣言する必要がある this修飾子にて、拡張メソッドを追加する型を指定する 拡張メソッドを含む名前空間をusing文で指定すると有効となる //拡張メソッドを含む名前空間を指定すると有効となる using B; namespace A { class Program { static void Main(string[] args) { //拡張メソッドの呼び出し "abc".Print(); //通常のstaticメソッドとしての呼び出しも可能 StingExtensions.Print("abc"); } } } namespace B { static class StingExtensions { //拡張メソッド public static void Print(this string str) { System.Console.WriteLine(str); } } } 拡張メソッドとインスタンスメソッドが重複した場合、インスタンスメソッドが優先される namespace A { class Program { static void Main(string[] args) { X obj = new X(); //クラスXのMethod()が呼ばれる obj.Method(); } } class X { public void Method() { } } static class Y { public static void Method(this X x) { } } } ラムダ式 ラムダ式は、式とステートメントを含めることができる匿名関数であり、デリゲート型または式ツリー型を作成するために使用される 演算子 = を使用する 演算子 = の左辺で入力パラメータを指定し、右辺で式、またはステートメントを指定する デリゲート型を作成する場合 namespace LambdaExpression { delegate int D(int x, int y); class Program { static void Main(string[] args) { //C#1.0 //外部メソッドを用意する必要があった D d1 = new D(Add); //C#2.0 //匿名メソッド使用 { }内に直接記述可能となった D d2 = delegate(int x, int y) { return x + y; }; //C#3.0 //ラムダ式使用 匿名メソッドより簡略し記述可能となった D d3 = (x, y) = x + y; //以下の記述も可 //D d3 = (int x, int y) = { return x + y; }; //D d3 = (int x, int y) = return x + y; //D d3 = (int x, int y) = x + y; Console.WriteLine(d1(1, 2)); Console.WriteLine(d2(1, 2)); Console.WriteLine(d3(1, 2)); } static int Add(int x, int y) { return x + y; } } } 式ツリー型を作成する場合 using System.Linq.Expressions; namespace LambdaExpression { class Program { static void Main(string[] args) { //ラムダ式をデリゲートに代入すると匿名メソッドとなる Func int, int, int f = (x, y) = x + y; Console.WriteLine(f(1, 2)); //ラムダ式をExpression式に代入すると式ツリー型となる Expression Func int, int, int e = (x, y) = x + y; var bin = (BinaryExpression)e.Body; var p1 = (ParameterExpression)bin.Left; var p2 = (ParameterExpression)bin.Right; Console.WriteLine(bin); Console.WriteLine(p1); Console.WriteLine(p2); } } } LINQ LINQは、Language Integrated Query(統合言語クエリ)の略 LINQにより、異なる種類のデータに対して統一したクエリ構文でアクセスが可能となった LINQにより、C#、VB.NETのコード内にクエリを記述することが出来る LINQにより、コンパイル時の型チェック、IntelliSenseの使用がクエリに対し可能となった 扱えるデータは主に以下となるオブジェクト(LINQ to Objects)XML(LINQ to XML)ADO.NETのDataSet(LINQ to DataSet)SQLサーバのデータベース(LINQ to SQL)ADO.NET Entity Frameworkから提供される概念エンティティ(LINQ to Entities) C$3.0でのLINQ to Objectsの例 class Program { static void Main(string[] args) { var persons = new[] { new { Name="Taro", Age=20 }, new { Name="Jiro", Age=18 } }; var adults = from person in persons where person.Age = 20 select new { person.Name, person.Age }; foreach (var adult in adults) { Console.WriteLine(adult.Name + "," + adult.Age); } } } C#2.0で同様のコードを記述した場合 class Program { static void Main(string[] args) { List Person persons = new List Person (); persons.Add(new Person("Taro", 20)); persons.Add(new Person("Jiro", 18)); List Person adults = new List Person (); foreach (Person person in persons) { if (person.Age = 20) { Person adult = new Person(person.Name, person.Age); adults.Add(adult); } } foreach (Person adult in adults) { Console.WriteLine(adult.Name + "," + adult.Age); } } } class Person { public string m_name; public int m_age; public Person(string name, int age) { m_name = name; m_age = age; } public string Name { get { return m_name; } set { m_name = value; } } public int Age { get { return m_age; } set { m_age = value; } } } 参考 C# 3.0 の概要 http //www.microsoft.com/japan/msdn/net/bb308966.aspx