相关疑难解决方法(0)

Template Haskell有什么不好的?

似乎模板Haskell经常被Haskell社区视为一种​​不幸的便利.我很难准确地说出我在这方面所观察到的内容,但请考虑这几个例子

我已经看过各种博客文章,其中人们使用模板Haskell做了相当简洁的东西,实现了更好的语法,这在常规的Haskell中是不可能的,以及巨大的样板减少.那么为什么模板Haskell以这种方式受到鄙视呢?是什么让它不受欢迎?在什么情况下应避免模板Haskell,为什么?

haskell template-haskell

249
推荐指数
6
解决办法
2万
查看次数

在支持循环和函数的语言中使用'goto'是否有利?如果是这样,为什么?

我长期以来一直认为,goto如果可能的话,永远不应该使用它.在前几天阅读libavcodec(用C语言编写)时,我注意到它的多种用途.goto在支持循环和函数的语言中使用是否有利?如果是这样,为什么?

c language-agnostic exception-handling goto

194
推荐指数
15
解决办法
5万
查看次数

如何在Javascript中使用goto?

我有一些我绝对必须使用的代码goto.例如,我想写一个这样的程序:

start:
alert("RINSE");
alert("LATHER");
repeat: goto start
Run Code Online (Sandbox Code Playgroud)

有没有办法在Javascript中这样做?

javascript goto

122
推荐指数
11
解决办法
23万
查看次数

使用goto有什么问题?

可能重复:
为什么使用goto不好?
GOTO仍被视为有害吗?

我通过xkcd进行了调整,看到了这个(几年前还读了一些关于它们的负面文章):
你的慢连接很糟糕,得到一个更快的看到这个图像
这究竟是什么问题?为什么goto甚至可以在C++中使用呢?

我为什么使用它们?

c++ goto

106
推荐指数
6
解决办法
7万
查看次数

功能中的过早返回效率

这是我作为一个经验不足的程序员经常遇到的情况,我特别想知道我正在努力优化的一个雄心勃勃,速度密集的项目.对于主要的类C语言(C,objC,C++,Java,C#等)及其常用的编译器,这两个函数是否同样有效运行?编译代码有什么区别吗?

void foo1(bool flag)
{
    if (flag)
    {
        //Do stuff
        return;
    }

    //Do different stuff
}

void foo2(bool flag)
{
    if (flag)
    {
        //Do stuff
    }
    else
    {
        //Do different stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上,是否有提前breakreturn早期的直接效率奖金/罚款?堆栈框架是如何涉及的?是否有优化的特殊情况?是否有任何因素(如内联或"Do stuff"的大小)可能会对此产生重大影响?

我总是支持改进可读性而非次要优化(我通过参数验证看到foo1很多),但这种情况经常发生,我想一劳永逸地抛开所有的担忧.

而且我知道过早优化的陷阱......呃,这些都是一些痛苦的回忆.

编辑:我接受了答案,但EJP的答案非常简洁地解释了为什么使用a return几乎可以忽略不计(在汇编中,return在函数末尾创建一个'分支',这非常快.分支改变了PC寄存器和也可能会影响缓存和管道,这是非常小的.)特别是对于这种情况,它实际上没有区别,因为它们if/elsereturn函数末尾都创建了相同的分支.

c c# c++ java compiler-optimization

96
推荐指数
5
解决办法
3976
查看次数

为什么Go有一个"goto"声明

谷歌的Go语言是一种新语言.因此,我惊讶地发现它有一个'goto'声明.我一直被教导说'goto'语句已成为过去,而且它会使程序的实际流程陷入窘境.功能(或方法,如果你愿意)总是一种更好的控制流量的方法.

我肯定错过了什么.为什么以及何时使用'goto'是一个好主意?或者谷歌为什么要加入它?

goto go

96
推荐指数
3
解决办法
4万
查看次数

使用'goto'语句不好吗?

在做了一些关于如何突破二次循环的研究之后

while (true) { // Main Loop
   for (int I = 0; I < 15; I++) { // Secondary loop
       // Do Something
       break; // Break main loop?
   }
}
Run Code Online (Sandbox Code Playgroud)

大多数人建议调用'goto'函数
看如下例:

while (true) { // Main Loop
   for (int I = 0; I < 15; I++) { // Secondary Loop
       // Do Something
       goto ContinueOn; // Breaks the main loop
   }
}
ContinueOn:
Run Code Online (Sandbox Code Playgroud)

然而; 我经常听说'goto'声明是不好的做法.下图完美地说明了我的观点: 系列发现

所以

  • goto语句真的有多糟糕,为什么?
  • 是否有一种比使用'goto'语句更有效的方法来打破主循环?

c# loops goto break

50
推荐指数
7
解决办法
2万
查看次数

为什么这个转到这个开关里面不起作用?

对于这个程序:

class Program
{
    static void Main(string[] args)
    {
        var state = States.One;
        switch (state)
        {
            case States.One:
                Console.WriteLine("One");
                break;
            case States.Zero:
                goto case States.One;
        }
    }
}

public enum States : ulong
{
    Zero = 0,
    One = 1,
}
Run Code Online (Sandbox Code Playgroud)

我有:

"switch表达式或case标签必须是bool,char,string,integral,enum或相应的可空类型"

state变量是enum类型.如果我评论该goto case行,错误就会消失.

我正在使用VS 2013. + .NET 4.5.1.

c# switch-statement

38
推荐指数
2
解决办法
2686
查看次数

C#相当于Java的继续<label>?

应该简单快捷:我想要一个与以下Java代码等效的C#:

orig: for(String a : foo) {
  for (String b : bar) {
    if (b.equals("buzz")) {
      continue orig;
    }
  }
  // other code comes here...
}
Run Code Online (Sandbox Code Playgroud)

编辑:好吧,似乎没有这样的等价物(嘿 - Jon Skeet自己说没有,这就解决了;)).所以我的"解决方案"(在其Java等价物中)是:

for(String a : foo) {
  bool foundBuzz = false;
  for (String b : bar) {
    if (b.equals("buzz")) {
      foundBuzz = true;
      break;
    }
  }
  if (foundBuzz) {
    continue;
  }
  // other code comes here...
}
Run Code Online (Sandbox Code Playgroud)

c# java

29
推荐指数
2
解决办法
1万
查看次数

可以替换链式开关/ goto的设计模式?

我有一个代码用于将我的应用程序资源更新为当前应用程序版本 应用程序更新后调用此代码.

int version = 1002;   // current app version

switch(version)
{
   case 1001:
      updateTo1002();
      goto case 1002;

   case 1002:
      updateTo1003();
      goto case 1003;

   case 1003:
      updateTo1004();
      goto case 1004;
      break;

   case 1004:
      updateTo1005();
      break;
}
Run Code Online (Sandbox Code Playgroud)

这里我们通过跳转到指定的case块来调用cascade方法.我想知道 - 在这种情况下,使用go(通常被视为这种不良做法!)是一种好习惯吗?我不想一个接一个地调用方法 - 像这样:

updateTo1002()
{
   // do the job
   updateTo1003();
}
updateTo1003()
{
   // do the job
   updateTo1004();
}
Run Code Online (Sandbox Code Playgroud)

有没有设计模式描述这样的问题?

c# design-patterns goto

28
推荐指数
4
解决办法
3378
查看次数