次のようなコードに出くわしました。
for(i=((90.0E1,0x5A)<=(0x158,140.70E1)?(.28,3.45E2,0):(95.30E1,26.40E1)<=1.400E2?(1,this):(108.,0x227));i<length;i++) {
// some other code here
}
for() ブラケット内のものを説明することで、誰かが私を助けることができますか?
次のようなコードに出くわしました。
for(i=((90.0E1,0x5A)<=(0x158,140.70E1)?(.28,3.45E2,0):(95.30E1,26.40E1)<=1.400E2?(1,this):(108.,0x227));i<length;i++) {
// some other code here
}
for() ブラケット内のものを説明することで、誰かが私を助けることができますか?
コンマ演算子の結果は常に右側の値です。したがって、フォーム (a,b) の各ペアは b に評価されます。あなたのコードでは「a」には副作用がないので、単純に省略して次のように取得できます。
for(i=(0x5A <= 140.70E1 ? 0 : ...);i<length;i++) {
"..." は重要でないものを表します: 0x5A <= 140.70E1 は と評価されるためtrue
、?:演算子の結果は疑問符の右側の値、つまり 0 になります。
したがって、結果は次と同等です
for (i=0; i<length; i++) {
これは理にかなっています。
for
これは、最初の式である初期化子がたまたま次のように定義されている、標準的な 3 つの式のステートメントです。
i = ((90.0E1,0x5A)<=(0x158,140.70E1)?(.28,3.45E2,0):(95.30E1,26.40E1)<=1.400E2?(1,this):(108.,0x227))
この式では、三項?:
演算子 and が、複雑なことに、ネストされた方法でこれを行います。
?:
演算子の構文は次のとおりです。
condition ? value if true : value if false
これを考えると、式は次のように構成されます。
condition: (90.0E1,0x5A)<=(0x158,140.70E1)
value if true: (.28,3.45E2,0)
value if false: (95.30E1,26.40E1)<=1.400E2?(1,this):(108.,0x227)
value-if-false は、?:
もちろん同じ方法で分解できる演算子を使用してネストされた式を保持します。
16 進数と E の数字を簡略化すると、次のようになります。
for(i=((900,90)<=(344,1407)?(.28,345,0):(953,264)<=140?(1,this):(108.,551));i<length;i++)
((900,90)<=(344,1407)?(.28,345,0):(953,264)<=140?(1,this):(108.,551)) == 0;
これにより、コードは次のようになります。
for(i=0;i<length;i++)
ループを作るのは非常に創造的で紛らわしい方法for
であり、良い冗談です。