我最近遇到了以下深奥的代码.
int main(){(([](){})());}
Run Code Online (Sandbox Code Playgroud)
按如下方式重新格式化以使其更具可读性:
int main(){
(([](){})()); // Um... what?!?!
}
Run Code Online (Sandbox Code Playgroud)
但我无法理解如何(([](){})())有效的代码.
谷歌对这种全符号搜索没有多大帮助.但它在Visual Studio 2010中编译并且不输出任何内容.没有错误,也没有警告.所以它看起来像有效的代码.
我从未见过任何在Javascript和C函数指针之外如此奇怪的有效代码.
有人可以解释这是如何有效的C++?
这个问题很难在问题标题中总结出来
UPDATE 我创建了构建一个模糊的字符串基于从这个问题中提取的字母输入您的的jsfiddle:您可以访问这里,或将一个要点是更容易?
我最近在这个配置文件中遇到了一些有趣的混淆JavaScript ,看起来像这样:
javascript:[[]+1/!1][1^1][1>>1]+({}+[])[1<<1^11>>1]+([]+!!-
[])[1<<1]+[/~/+{}][+!1][-~1<<1]+([]+/-/[(!!1+[])[1>>1]+(!!1
+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1]+([,][
~1]+[])[1-~1]+[[]+{}][!1.1%1][11111.1%11.1*111e11|!1]+(/1/+
1/[1<1][1%1])[1^11]+[[],[]+{}][1][+1]+(/<</[1]+[])[1/1.1&1]
Run Code Online (Sandbox Code Playgroud)
很抱歉破坏了惊喜但是当评估它时会返回:
"I love you" in Chrome
"I lone you" In Firefox
"I lo[e you" in IE10
Run Code Online (Sandbox Code Playgroud)
分解时的工作方式是生成一系列消息并从中拉出字母(使用"I"作为示例):
[]+1/!1
returns
"Infinity"
then
[[]+1/!1]
creates this array:
["Infinity"]
then
[[]+1/!1][1^1]
Takes the first (1^1 == 0) element of that array
"Infinity"
finally
[[]+1/!1][1^1][1>>1]
Takes the first (1>>1 == 0) char of that string
"I"
Run Code Online (Sandbox Code Playgroud)
生成的其他字符串包括:
({}+[]) -> "[object Object]" (where the space comes from)
([]+!!-[]) -> …Run Code Online (Sandbox Code Playgroud) alert((![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]);
Run Code Online (Sandbox Code Playgroud)
此代码的输出是:fail.为什么?
顺便说一句(![]+[])[+!+[]] == 'false'[1],对吗?但为什么![]+[] == "false"和为什么+!+[] == 1?
在阅读dzone上发布的这篇文章时,我发现了一段最初由Marcus Lagergren在Twitter上发布的JavaScript片段.
以下代码显然打印字符串 "fail"
(![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]];
Run Code Online (Sandbox Code Playgroud)
这涉及隐式类型转换,我试图理解这条线的解释方式.
我已经隔离了每个角色
(![]+[])[+[]] 版画 "f"(![]+[])[+!+[]] 版画 "a"([![]]+[][[]])[+!+[]+[+[]]] 版画 "i"(![]+[])[!+[]+!+[]] 版画 "l"我还设法打破了每个字母除外的表达式 "i"
"f"![]空数组是一个对象,它根据ECMAScript的文档,点9.2的计算结果为true当转换为一个boolean,所以这是false
false+[]根据Point 11.6.1,二元+运算符的两个参数都转换为String,因此我们得到"false"+"",它进行求值"false"
+[]如果参数是a,则一元加号运算符会导致ToNumber转换,然后ToPrimitive转换Object.通过调用[[DefaultValue]]对象的内部方法来确定这种转换的结果.如果是空数组,则默认为0.(ECMAScript的文档,章节:11.4.6,9.3,9.1)
"false"[0]我们正在访问索引处的字符0,因此"f"
"a"同样的故事,这里唯一的区别是方括号中的部分中的额外转换(其计算为指向字符串中另一个字符的数字"false"),由使用一元+和!运算符触发.
+[]0 …
为什么Math.min([])评估0?
我希望它会评估,NaN因为MDN的Math.min联机帮助页指出"如果至少有一个参数无法转换为数字,则返回NaN."
所以我想这个精炼的问题是为什么[]强制为0?特别是考虑到这[]是真实的(即!![] === true)和Math.min(true) === 1.我在想这个错吗?
在Node v7.0.0上测试
我试图理解这个回文表达式是如何给出的.我知道运算符优先级规则,但这超出了我当前的Javascript级别.我怎么开始?
alert ("The answer is " +
[(0>>(0==0))+([0]+[(0==0)+(0==0)]^0)]*[(0^[(0==0)+(0==0)]+[0])+((0==0)<<0)]
);
Run Code Online (Sandbox Code Playgroud) 添加两个空数组:[] + []会产生一个空字符串.为什么?
还有像这样的奇怪功能集合上的任何链接?
我想知道几天......我知道JavaScript中的一元加号首先将它的操作数转换为数字.我正在应用+到一个空数组,我得到以下结果:
+[] == 0
Run Code Online (Sandbox Code Playgroud)
当我这样做:
+[1] == 1
Run Code Online (Sandbox Code Playgroud)
但:
+[1,2] == NaN
Run Code Online (Sandbox Code Playgroud)
最后两件事几乎是清楚但为什么空数组是0?!这与以下内容有关:
[] == false
Run Code Online (Sandbox Code Playgroud)
有时ECMAScript让我很奇怪......
alert([![]+[]][+[]][+[]]+[![]+[]][+[]][+!+[]]+[!+[]+[]][+![]][+![]]+[![]+[]][+[]][+!+[]]+[![]+[]][+[]][+!+[]+!+[]]+' '+(![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]);
Run Code Online (Sandbox Code Playgroud)
最好的祝福!
alert(
(![]+[])[[]-[]]+
(([]+[])+([][[]]))[[]-[]]+
(([]+[])+([][[]]))[!![]-[]]
);
Run Code Online (Sandbox Code Playgroud)
继承人的小提琴:http://jsfiddle.net/leeny/6VugZ/
这段神秘的代码究竟是如何工作的?
我最近看到一个来自某个来源的表达式,看起来如下所示 -
++[[]][+[]]+[+[]]
Run Code Online (Sandbox Code Playgroud)
在Chrome(Windows 7,版本27.0.1453.94 m)控制台中输入此内容即可显示结果"10".
有人能解释一下这里发生了什么吗?
javascript ×9
obfuscation ×2
c++ ×1
c++11 ×1
ecmascript-5 ×1
expression ×1
lambda ×1
syntax ×1
types ×1