在这个问题中,我问下面的代码片段是如何工作的,因为它涉及奇怪的变量使用:
while (+(+i--)!=0)
{
i-=i++;
}
console.log(i);
Run Code Online (Sandbox Code Playgroud)
有趣的问题......你已经将它标记为Java,JavaScript和C - 请注意,虽然这些语言具有相同的语法,但这个问题涉及非常微妙的语义,可能(我不确定)语言不同.
让我们分解一下:
+(+i--)
Run Code Online (Sandbox Code Playgroud)
该--后缀减量运算符将最为紧密结合.所以这相当于+(+(i--)).因此,它等于+(+i)(即i)的值,但i在取值后也会减少.它将值与0进行比较,以查看循环是否应该继续.因此,while (+(+i--)!=0)相当于以下内容:
while (i-- != 0)
Run Code Online (Sandbox Code Playgroud)
请注意,它也在i--循环结束时执行.
在循环内部,我相信你有一些未定义的行为,至少在C中,因为你i在右边引用,并且i在左边更新- 我相信C没有定义在那里做的那个.所以你的结果可能因编译器而异.至少Java是一致的,所以我会给出Java答案.i-=i++等同i = i - i++,这相当于到读取所有的值进行表达的,计算的表达式的结果,将所述后递增,然后分配结果返回.那是:
int t = i - i; // Calculate the result of the expression "i - i++"
i++; // Post-increment i
i = t; // Store the result back
Run Code Online (Sandbox Code Playgroud)
显然,这与写作相同i = 0.所以循环体将i设置为0.
因此,循环只执行一次,将i设置为0.然后,它i在下一个while循环中i再次减少,但由于(在递减之前)== 0 而未通过检查.
因此,-1无论初始值i是多少,最终答案都是.
把这些放在一起并编写一个等效的程序:
while (i-- != 0)
{
int t = i - i;
i++;
i = t;
}
console.log(i);
Run Code Online (Sandbox Code Playgroud)
当我在Java和JavaScript中尝试它时,这就是我得到的.对于GCC(C编译器),它仅在i从0 i开始时给出-1.如果以其他任何方式开始,则进入无限循环.
那是因为在GCC(不一定是所有C编译器)中,i-=i++有不同的含义:它将存储返回到i第一个,然后进行后增量.因此,它相当于:
int t = i - i; // Calculate the result of the expression "i - i++"
i = t; // Store the result back
i++; // Post-increment i
Run Code Online (Sandbox Code Playgroud)
这相当于写作i = 1.因此,在第一次迭代时,它设置i为1,然后在循环中,它检查是否i == 0,它不是,因此它再次出现,始终设置i为1.这将永远不会终止,但对于特殊情况,i从0开始; 然后它将始终终止循环并减少i(所以你得到-1).
另一个C编译器可能会选择像Java一样行事.这表明你永远不应该编写分配和后增加相同变量的代码:你永远不知道会发生什么!
编辑:我试图使用那个for循环太聪明; 这不等同.转回一个while循环.
| 归档时间: |
|
| 查看次数: |
223 次 |
| 最近记录: |