什么?没有错吗 [关闭]


197

您的任务很简单。编写一个程序,乍一看显然应该在编译或运行时产生一个错误,但不会或者不会产生一些其他不相关的错误。这是一场人气竞赛,请发挥创意。


11
嗯...这是一个脑筋急转弯。+1
Tim Seguine 2014年

1
希望我能找到它……有一个旧的PL / I示例,其中包含一条语句,内容为“如果if = if则then then else else else else if if else else ...”(PL / I允许使用其关键字为变量名,并具有类似于C的?的条件表达式:还使用了if / then / else关键字...)
keshlam 2014年

8
我建议使用完整的操脑语言,因为BF代码看起来好像不会编译。
Agi Hammerthief 2014年

@NigelNquande,只有在您不熟悉它的时候...;)
Jwosty 2014年

Answers:


282

C ++

确保以标准模式编译以下代码(例如,对于g ++,请使用-ansi标志):

int main()
{
  // why doesn't the following line give a type mismatch error??/
  return "success!";
}

这个怎么运作:

?? /是一个Trigraph序列,它转换为反斜杠,可以转义后面的换行符,因此下一行仍然是注释的一部分,因此不会产生语法错误。请注意,在C ++中,省略return的main定义很明确,等效于返回0,表示运行成功。


7
我觉得第一个答案只是立即获得了这一殊荣。
临时用户名

1
在C99中也有效。
R.,

1
有与-Wall警告
BЈовић

2
@BЈовићWall总是对一切发出警告
Kiwy 2014年

4
@Kiwy仅对上面的垃圾代码引发警告。-Wall不会对所有内容都发出警告。
BЈовић

86

红宝石

一直是这个的粉丝。

x = x

没有NameError。x现在nil

这只是Ruby的“功能” :-)

这是我之前得到的一个平凡的东西:

x = 42

if x < 0
  raise Exception, "no negatives please"
elseif x == 42
  raise Exception, "ah! the meaning of life"
else  
  p 'nothing to see here...'
end 

打印“这里什么也看不到”。

elsif,不是elseif。(当然不是elif-任性的python程序员(我)很不幸!)所以对于解释器elseif看起来像一个普通的方法调用,并且由于我们没有输入x <0块,因此我们直接进入else和不要提出例外。此错误在任何语法突出显示的环境中都非常明显,值得庆幸的是(?)代码高尔夫不是这样的环境。


5
你懂我 之前我已经做过Python和Lua,现在从Ruby开始。Lua使用了那个。
2014年

7
宇宙的意义没什么可看的?
user80551 2014年


77

C?

很普通的代码在这里...

void main() = main--;

它是Haskell,而不是C。它定义了一个带有两个参数的名为“ void”的函数。第一个命名为“ main”,如果第二个(未命名)为空元组,则返回“ main”变量。“-”在Haskell中开始注释,因此“;” 已被注释掉。


21
换句话说,这是作弊吗?
李斯特先生2014年

75
作弊是代码挑战赛中的正常现象。我们称之为创造力。:P
Joe Z.

31
我称其为作弊,不是创造力。您必须先定义运行环境,然后才能考虑某些代码是否会出错。否则,我只能给您提供Malbolge的线路噪音,然后询问您是否可以编译。
Tim S.

5
它只是应该让您停下来一秒钟然后走,“嘿,您能做到吗?” :)
intx13 2014年

10
@JoeZ。在某些情况下,它可能看起来像perl。
user80551 2014年

72

的JavaScript

var а = 100;
if (typeof a !== 'undefined') throw 'This should always throw, right?';
console.log('How am I still alive?');

运作方式如下:

第一个a实际上是一个а(即Cryllic Unicode“ a”)。


8
该技巧可以应用于接受Unicode令牌的任何语言(例如Java,C#)。
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 2014年

83
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳,以您的用户名为例
TheDoctor

9
太明显的解决方案
thepirat000 2014年

6
对于以前遇到的任何人来说太明显了。我敢肯定,很多新手和所谓的“网络专家”都可能对此感到迷恋。
Thebluefish 2014年

42
明显?因此,您总是通过Unicode数字而不是按外观来查看变量名吗?如果您搜索“ a”(或“а”?)而没有找到期望的内容,您可能会注意到它,但是仅阅读时,您就看不到它(至少在这里显示的字体中)。
Tim S.

70

的JavaScript

当我提供以下代码时,我多次被告知:“它一定是拼写错误!它如何工作?”

console.log( 42..toString(2) );

下面的描述完全摘自最近的一个案例

您可能知道,在JavaScript中,除了文字之外的所有东西都是一个对象。数字也是对象。因此,从理论上(和实际上),您可以像通过'string'.length或那样通过点符号获取任何非文字的属性或调用方法[1,2,3].pop()。如果是数字,您可以这样做,但是要记住,在单点之后,解析器将寻找期望浮点值的数字的小数部分(如所示123.45)。如果您使用整数,则应“告诉”解析器小数部分为空,请在处理属性之前设置一个额外的点:123..method()


18
作为一个Lua,我期待着422
mniip 2014年

3
以前没有看过这种用法,非常整洁。
Nit 2014年

5
习惯于这种..表示法会很不好,但是对于这种.toString(a freaking argument here?)表示法却一无所知:P哦,好了,到现在为止就知道了:)
David Mulder 2014年

这个输出是什么?又为什么呢?我好奇。
Nicolas Barbulesco 2014年

3
对于懒惰的人,该参数指定了基数(因此它将以二进制形式显示42),并且对于此代码一点都不重要。..是令人困惑的部分。
2014年

63

重击

#!/bin/bash

[ 1 < 2 ] && exit

for i in `seq 1 $[2 ** 64]`
    do "$0" | "$0"
done

while [[ false ]]
    do :
done

if maybe
    do [: [: [: [: [; [; [; [; ;] ;] ;] ;] :] :] :] :]
fi

结果

  • 您可能希望脚本完全不产生任何错误,因为它会在第一个命令之后退出。没有。

  • 您可能会期望由于for循环而导致正在进行的分叉炸弹引起的典型错误消息。没有叉子炸弹。

  • 您可能希望bash抱怨该块中缺少maybe命令或语法错误if。不会的

  • 该脚本可能产生的唯一错误消息以结尾2: No such file or directory

说明

  • [bash并不特殊,因此< 2像往常一样执行重定向。除非2当前目录中有名称相同的文件,否则将导致错误。

  • 由于上述错误,之前的命令&&将具有非零的退出状态,并且exit将不会执行。

  • for循环不是无限的。实际上,根本没有循环。由于bash无法计算2的64次幂,因此算术表达式的结果为0

  • [[ false ]]测试是否false为空字符串。不是,所以这个while循环是无限的。

  • 由于上述原因,该if语句永远不会执行,因此不会检测到错误。



47

爪哇

class Gotcha {
    public static void main(String... args) {
        try  {
            main();
        } finally {
            main();
        }
    }
}

这里没有堆栈溢出;向前走。

乍一看,这应该会产生StackOverflowError,但不会!它实际上是永远运行的(至少出于所有实际目的;从技术上讲,它将在比宇宙时代长许多数量级的时间后终止)。如果您想知道它的工作方式/原因,请参阅this。另外,如果您碰巧想知道为什么main()当main方法通常需要一个参数时我们可以不带参数调用String[]:那是因为我们在这里将其声明为变量参数,这是完全有效的。


3
正如您所链接的问题所解释的那样,它不会无限期运行,而是会运行很长时间。
凯文(Kevin)

1
@Kevin让我们不要在这里不必要地学究;就所有实际目的而言,“比宇宙的年龄更长”是“永远”。
arshajii 2014年

8
您说“这里没有堆栈溢出”,实际上,系统不断抛出堆栈溢出,最终将引发堆栈溢出异常。(如您所述,最终可能会花费非常长的时间)而且,这取决于堆栈深度。在较小的VM或嵌入式系统上,堆栈深度可能要小得多。
麦凯2014年

@McKay该声明显然只是一个简单的说法,并不意味着从字面上理解。OP要求一个看起来像它会产生错误但不会产生错误的程序。在一般情况下,以上答案可以满足此要求。当然,我们可以构想出一种并非如此的模糊情况,但这不会使答案无效。希望您能重新考虑一下自己的观点。
arshajii 2014年

3
@McKay顺便说一句,假设堆栈大小很小(例如100,而不是正常〜10,000),我们可以仍然使每秒10,000,000电话。然后总运行时间为4,019,693,684,133,147年-仍然比宇宙时代大许多数量级。
arshajii 2014年

42

CoffeeScript

What? No error? Yep, this code does not have any bugs, why would it?

?后面跟一个空格的是运算符,它调用函数,但前提是函数存在。JavaScript没有称为的函数What,因此未调用该函数,并且其参数被忽略。代码中的其他词是实际上不被调用的函数调用,因为What函数不存在。最后,?是存在运算符,因为它没有在调用函数中使用。其他句子结尾(例如.!不起作用).(对于方法而言),并且!不是运算符(不能在标识符后使用)。要了解CoffeeScript如何将其转换为JavaScript,请访问http://coffeescript.org/#try:What%3F%20No%20error%3F%20Yep%2C%20this%20code%20does%20not%20have%20any%20bugs%2C %20why%20it%20would%3F


36

VB脚本

&VBScript中的运算符是字符串连接,但是&&and &&&运算符到底是什么?(回想一下,VBScript中的“和”运算符是And,不是&&。)

x = 10&987&&654&&&321

该程序片段是合法的VBScript。为什么?的值是x多少?

词法分析器将此分解为x = 10 & 987 & &654& & &321&令人惊讶的是,以开头的整数文字是八进制文字。以八进制结尾的八进制文字&,甚至更奇怪的是,一个长整数。因此x的值是这四个整数的十进制值的串联10987428209


8
只是...哇。
primo 2014年

27

目标C

没什么大不了的,但是当我尝试在评论中添加链接时,我感到很惊讶:

http://www.google.com
        return 42;

http是此处的代码标签,此类标签用于goto指令中


8
这应该可以在支持//注释的任何类似于C的语言中工作。
Ilmari Karonen 2014年

是的,可能我只是不确定在发帖时
Piotr 2014年

14
不过,每个范围的每个协议限制一个URL。
Ben Voigt 2014年

1
您仍然可以在相同范围内使用https://。
Florian F

25

C#

class Foo
{
    static void Main(string[] args)
    {
        Bar();
    }

    static IEnumerable<object> Bar()
    {
        throw new Exception("I am invincible!");
        yield break;
    }
}

由于该Bar方法执行yield,因此该方法在被调用时实际上并未运行,因此它返回一个枚举器,该枚举器在迭代时将运行该方法。


最后...这是FOO和BAR :)
VVK 2014年

1
这就是foo和bar的含义;)其实无关紧要的事物的名称。
麦凯2014年

22

C

main=195;

在x86平台上运行,其中195是ret的操作码。什么也没做,


ret的操作码是195,而不是193,对吧?
丹尼斯

对我不起作用。我预计这将在地址195执行的代码
nwellnhof

Tbanks @Dennis,代码正确,解释错误。
ugoren 2014年

3
在可以读取页面而不执行的任何平台上(包括现代 x86),main由于main已放置在不可执行的数据段中,因此在进入时会崩溃。有趣的是,const int main=195不会崩溃(基于x86)(但会产生垃圾退出状态),因为.rodata默认情况下,被摆在同一网段.text,因此是可执行的。(const char main[]="1\300\303";将成功退出!(仍在x86上))
zwol 2014年

2
我在64位计算机上(我不知道这是否会改变任何东西),并且main = 195给出段错误,但是const int main = 195; 作品。
w4etwetewtwet 2014年

21

爪哇

可能太明显了。

public static void main(String[] varargs) throws Exception{
    char a, b = (char)Integer.parseInt("000d",16);
    // Chars have \u000d as value, so they're equal
    if(a == b){
        throw new Exception("This should be thrown");
    }
}

什么?

之后会引发语法错误\u000d\u000d是新行的unicode。即使已注释掉,Java编译器也将之后的内容视为代码,因为不再注释掉了。


11
varargs不是可变参数;)
纳文2014年

问题是“看起来失败但没有失败的代码”,而不是“看起来失败但以不同的方式失败的代码”。出现语法错误而不是异常仍然是错误。
2014年

19
我认为您应该再次阅读原始问题:“或产生其他不相关的错误。”
Tom Verelst 2014年

实际上,如果没有\u000d,它将使用对未定义值的引用a
LegionMammal978

19

C ++

#include <iostream>

int succ(int x)
{
  return x + 1;
}

int succ(double x)
{
  return int(x + 1.0);
}

int succ(int *p)
{
  return *p + 1;
}

int main()
{
  std::cout << succ(NULL) << '\n';
}

为什么?

NULL是一个整数常数,因此它与int重载的匹配严格优于一个常数int*。尽管如此,大多数程序员都NULL与指针相关联,所以可以预期会出现空指针取消引用。


11
幸运的是,C ++ 11允许实现定义NULLnullptr,而这样做的实现(我还不知道,但我确实希望它们)将给出预期的分段错误。
2014年

16

蟒蛇

print """""quintuple-quoted strings!"""""

完全有效,但输出很难猜测。前3个字符以多行字符串开头,后两个字符为字符串的一部分。最后,前三个字符终止字符串,后两个为空字符串文字,解析器将其连接到多行字符串。


20
只是一个奖励:print """""""""Python strings don't have to start with the same number of quotes they end with."""""
Konrad Borowski

15

的JavaScript

if (1/0 === -1/0) {
  throw "Surely there's an error in here somewhere...";
}

这个怎么运作:

JS中存在正负无穷大,除零没有错误。


2
您也应该也可以使用NaN进行一些技巧...
intx13 2014年

8
嗯,这发生在任何带有浮点数的语言中。
纳文2014年

3
@Navin:使用浮点数的任何语言,除以零都不会导致错误。
nwk

2
@nwk浮点数的IEEE标准指出,零除必须为inf。我不知道会改变这种情况的任何语言。
纳文2014年

1
IEEE 754指定了两种模型:发信号通知NaN / Inf(在FP零除上引发异常,从-1 求平方根,下溢/上溢等)和非信号处理(与定义好的数学一样对待NaN/ Inf就像常规代数值一样)在他们)。现代FP硬件可以配置为双向运行。与语言无关;可惜不知道。
ulidtko 2014年

14

C ++

组合三字母组合和无空间的lambda可能会造成混乱,对于不知道三连字母的人来说绝对是错误的:

int main()
{
    return??-??(??)()??<return"??/x00FF";??>()??(0??);
}

这个怎么运作:

某些由3个以??开头的符号组成的序列称为三字组合,将由完全兼容的预处理器代替。经过预处理的相关行如下所示:return〜[](){return“ \ x00FF”; }()[0]; 可以看到,这不过是一个多余的lambda函数,它返回由0xFFth字符组成的字符串。在[0]只是提取该字符和组合这些,所以返回0。


12
int main(){(([](){})());}三个字母时,有效的C ++程序看起来也不错……
Angew 2014年

1
那个人甚至做什么?
Joe Z.

1
@Joe Z [](){}是一个lambda函数,就像[](int a){return a+1;}一个函数一样。([](){})()调用该函数,void如果我没记错的话返回。然后,整体(([](){})());归结为(void);,这是一条无所事事的声明。main然后只返回零,就像它没有return声明一样。
tomsmeding

13

VBA / VB6

Private Sub DivByZero()

    Dim x() As String
    x = Split(vbNullString, ",")

    Debug.Print 1 / UBound(x)

End Sub

分割一个用逗号分隔的空字符串应该得到一个空数组。应该是零误差的明显除法,对吗?

不。令人惊讶的是,当分割任何零长度的字符串时,运行时会为您提供一个数组,下限为0,上限为-1。上面的代码将输出-1。


@minitech实际上,如果将一个空数组传递给UBound,它将给您下标超出范围的错误。
Comintern

… 好。我收回之前说过的话。VBA = /
2014年

1
@minitech是的。我知道这是VB6中Split的原始实现中的错误。在.NET中,他们故意“添加”(或记录为更好的词)空数组返回UBound -1的行为,以保持与利用此hack的所有VB6代码的向后兼容性。拆分空字符串是在没有Windows API调用的情况下在VBA / VB6中本地获取此数组的唯一方法。
Comintern 2014年

12

Java脚本

5..toString();
5 .toString();

给出:5

鉴于:

5.toString();

给出SyntaxError

这个怎么运作:

JavaScript尝试将数字上的点解析为浮点文字


13
您发布与我一个小时后完全一样的案件是怎么发生的?
2014年

1
嘿,愿景,对不起,但我没有检查您的答案。我还添加了一个带空间的箱子。我曾经在javascript花园中阅读过这篇文章。
Sumeet Kashyap 2014年

1
Sumeet,别后悔。您的答案比@VisioN更好,也更清晰。
Nicolas Barbulesco 2014年

12

的HTML

在这里的第一篇文章,我不确定是否能做到这一点,但是可以。

<html>
    <head></head>
    <body>
        <?php $_POST['non-existant'] = $idontexisteither ?>
    </body>
</html>

这是一个.html文件...


9
因此,窍门就是它不会执行PHP块,因为该文件具有.html扩展名并且您的Web服务器未配置为将.html文件解析为PHP?
2014年

5
是。这是作弊吗?@VisioN
Albzi 2014年

2
我很确定这是作弊。至少在顶部以粗体显示“ HTML”。
纳文2014年

不错!:-)这招对我有效。
Nicolas Barbulesco 2014年

1
我进行了编辑,以明确用哪种语言写成
vijrox

9

PHP(40字节)

<?for(;;$e.=$e++)foreach($e::$e()as&$e);

这是我在以下问题中给出的答案:精神错乱检查程序

想法是制作一个会产生错误的代码。

我们将想到的第一个错误是语法错误。

没有语法错误...

另一个可能是该类/函数不存在。

它没有那么远...

另一个可能是超时或内存溢出,但同样,它还没有达到那么远……

在此处测试代码:http : //writecodeonline.com/php/(删除<?开始测试的)。


3
这是一次人气竞赛。无需增加您的代码来节省字节。只需重新格式化以提高可读性即可;)
Songo 2014年

稍后将添加可读版本。我使用了完全相同的答案,并且完全没有进行编辑。
Ismael Miguel 2014年

foreach(e()as&$e);是此解决方案的核心。e()只是为了使语法检查器继续运行,&$e之后as才是导致失败的原因。
TheConstructor 2014年

实际上,一切都起着重要作用。
Ismael Miguel

9

VB脚本

Visual Basic 6用户将知道

If Blah Then Foo Bar

是合法的

If Blah Then 
    Foo Bar
End If

但是关于

If Blah Then Foo Bar End If

?事实证明这在VBScript中是合法的,但在VB6中却不合法。为什么?

这是解析器中的错误;目的是拒绝这个。用于检测的代码也End If应该检查它是否是多行If语句,但不是。当我尝试修复该问题并发布了该修复程序的Beta版本时,某个颇具影响力的行业新闻机构发现他们在其VBScript程序之一中拥有这一行代码,并表示除非我们取消对新版本的评价,否则他们将给予较低的评价。修复了该错误,因为他们不想更改其源代码。


除了允许您编写在VB6中无效的VBS代码之外,让该错误保持不变是否有任何弊端?
2014年

1
@Gabe:不,除了很难将VBScript代码移植到VB之外,没有其他缺点。
埃里克·利珀特

1
一个名字 !这个新闻机构是谁?
Nicolas Barbulesco 2014年

9

C

这让我想起了我在学习C时遇到的一个错误。可悲的是,原始变体似乎不适用于当前的GCC,但是这个仍然可以:

#define ARR_SIZE 1234
int main() {
    int i = ARR_SIZE;
    int arr[ARR_SIZE];
    while(i >= 0) {
        (--i)[arr] = 0;
    }
    i = *(int*)0;
}

这显然是段错误,因为我们取消引用了空指针,对吗?

错误-实际上,这是一个无限循环,因为我们的循环条件差了一个。由于前缀递减,因此i从1023到-1。这意味着分配不仅会覆盖中的所有元素arr,还会覆盖紧接其之前的存储位置-恰好i是存储位置。达到时-1,用i覆盖自身,0从而再次满足循环条件...

这是我无法复制的原始变体:

相同的事情是i从0上升到1。永远是最新的GCC店iarr在内存中; 在旧版本中,这必须有所不同(可能取决于声明顺序)。这是我在处理数组的第一个玩具程序中产生的一个实际错误。

此外,如果您知道指针在C中的工作方式,那么这很明显,但如果不这样做,可能会感到惊讶:

您可能会认为的分配会(--i)[arr]引发错误,但是它是有效的,并且等效于arr[--i]。表达式a[x]只是语法糖,*(a + x)它为索引的元素计算和取消引用指针;加法当然是可交换的,因此等效于*(x + a)


1
据我所知,永远不要执行循环体(因为1234 <= 0的结果为false)。您可能是想写“> =”吗?
celtschk 2014年

1
@celtschk是的,那是一个错字。感谢您的关注!
l4mpi 2014年

是实际指定了此内存对齐方式,还是在某些编译器中以这种方式实现了此对齐方式?
圣保罗Ebermann

9

爪哇

public class WhatTheHeckException extends RuntimeException {
    private static double d;        // Uninitialized variable
    public static void main(String... args) {
        if (d/d==d/d) throw new WhatTheHeckException();
        // Well that should always be true right? == is reflexive!

        System.out.println("Nothing to see here...");
    }
}

工作原理:

统一字段具有默认值。在这种情况下,d仅为00/0 = NaN为双除,NaN永远不等于自身,因此if返回false。请注意,如果您有0/0 == 0/0,这将不起作用,因为at为整数0/0除法将抛出ArithmeticException


8

C ++ 11

struct comp {
    comp operator compl () { return comp { }; }
    operator comp () { return comp { }; }
    compl comp () { return; comp { }; }
};

int main() {
    comp com;
    compl com;
}

使用编译并运行时没有任何警告g++ -pedantic-errors -std=c++11

compl是的标准替代拼写~,就像not是的替代拼写一样!compl用于此处首先覆盖operator~,然后定义析构函数。另一个技巧是operator comp从类型comp到自身的转换功能。令人惊讶的是,该标准并未禁止使用这种转换功能-但它确实说从未使用过这种功能。


8

VB脚本

function[:(](["):"]):[:(]=["):"]:
end function
msgbox getref(":(")(":)")

'Output: :)

它能做什么:

如果使用方括号,则VBScript中的函数名称,子名称和变量名称可以是任何名称。该脚本使函数称为:(和一个参数,"):"但是由于它们不遵循常规的命名约定,因此将它们用方括号括起来。返回值设置为参数值。另一个冒号用于将所有内容都放在一行上。Msgbox语句获取对该函数的引用(但不需要括号),并以笑脸:)作为参数进行调用。


1
皱着眉头的脸那么多:(
乔Z.

8

C#

实际上,我误以为是错误的:)

public static object Crash(int i)
{
    if (i > 0)
        return i + 1;
    else
        return new ArgumentOutOfRangeException("i");
}

public static void Main()
{
    Crash(-1);
}

,不


哈哈,欢迎光临本站!作为第一篇文章的勇敢之处,我感到很荣幸。:)
乔纳森·范·马特雷

7

爪哇

enum derp
{

    public static void main(String[] a)
    {
        System.out.println(new org.yaml.snakeyaml.Yaml().dump(new java.awt.Point()));
    }
}

以及它是如何工作的:

首先,您认为枚举无效,但有效。那么您认为它将打印一个标准的Point对象属性,但该怎么做!由于Snakeyaml如何序列化,您会得到一个平滑的StackOverFLow错误

还有一个:

enum derp
{

    ;public static void main(String[] a)
    {
        main(a);
    }
    static int x = 1;

    static
    {
        System.exit(x);
    }
}

您认为Stackoverflow会由于明显的递归而发生,但是该程序滥用了以下事实:在您运行它时,static{} block它将首先执行,并且由于它在main()加载之前退出

enum derp
{

    ;
        public static void main(
            String[] a)
    {
        int aa=1;
        int ab=0x000d;
        //setting integer ab to \u000d  /*)
        ab=0;

        /*Error!*/
        aa/=ab;
    }
    static int x = 1;
}

/*Error*/代码依靠注释掉的代码作为在ab = 0之前打开的注释的关闭点;关于整数ab到0x000d的说明隐藏了换行符以激活下一行的注释


1
我现在不能,但是如果可以的话,将其重新格式化会很好。:P
Jwosty 2014年

使它们更加明显;和扰流器标签的目的是使这些技巧
乍一看

2
等待,那么第一个实际上会产生错误吗?这与问题的提出恰恰相反。还有,为什么第二个不只是System.exit(1)?
2014年

3
没有Java程序员会期望第二个片段中出现堆栈溢出。抱歉,这太明显了。
Tobias 2014年

1
@VVK codegolfing习惯使用enum{而不是class{保存一个字节,然后
masterX244 2014年

6

C

c中的字符串和数组可能会造成混乱

main(){
  int i=0;
  char string[64]="Hello world;H%s";
  while(strlen(&i++[string])){
    i[' '+string]=string[i]-' ';
  }
  5[string]=44;
  return printf(string,'!'+string);
}

9
它很难阅读,但我不知道人们会因此期望什么错误
Bryan Chen

3
我只是想提醒人们有效但非常规的表示法,请随心所欲。在说这是正确的之前,我肯定会看三遍。首先,像5 [string]这样的表达式不是偶然的编码器所熟知的,它违背了数组索引的逻辑。其次,''+ string看起来像添加2个字符串,但是引号类型错误。第三,&i ++看起来像是整数的地址(但优先级负责)。最后,我们编写的内容超出字符串文字范围(但不超出更大的后备缓冲区)。
Orion

看起来还不错。我只用C ++编写了一些代码,但是我可以弄清楚。
纳文2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.