3

我遇到了一段代码:

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() 括号中的内容来帮助我吗?

4

3 回答 3

5

逗号运算符的结果始终是右侧的值。因此,每对形式 (a,b) 的计算结果为 b。由于在您的代码中“a”从来没有副作用,我们可以简单地省略它来获得:

for(i=(0x5A <= 140.70E1 ? 0 : ...);i<length;i++) { 

其中“...”代表无关紧要的东西:由于 0x5A <= 140.70E1true的计算结果为 ,所以?:运算符的结果是问号右侧的值,即 0。

所以结果等价于

 for (i=0; i<length; i++) { 

这是有道理的。

于 2010-07-25T14:22:56.020 回答
2

这是一个标准的三表达式for语句,其中第一个表达式,初始化器,恰好被定义为

i = ((90.0E1,0x5A)<=(0x158,140.70E1)?(.28,3.45E2,0):(95.30E1,26.40E1)<=1.400E2?(1,this):(108.,0x227))

在这个表达式中,三元?:运算符,更复杂的是,它以嵌套的方式执行此操作。

?:运算符的语法如下

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 包含一个使用?:运算符的嵌套表达式,当然可以以相同的方式解构。

于 2010-07-25T14:26:43.930 回答
0

简化十六进制和 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循环方式,也是一个很好的笑话。

于 2010-07-25T14:26:49.000 回答