在这个主题中,我们看一下gotoC或C++ 的良好用法示例.它的灵感来自人们投票的答案,因为他们认为我在开玩笑.
摘要(标签从原始标签更改为使意图更清晰):
infinite_loop:
// code goes here
goto infinite_loop;
Run Code Online (Sandbox Code Playgroud)
为什么它比替代品更好:
goto是导致无条件分支的语言构造.替代方案取决于使用支持条件分支的结构,具有退化的始终为真的条件.breakS(尽管它仍然可能无原则黑客模拟
continue与早期goto).规则:
让我们看看我们是否可以像成年人一样谈论这个问题.
编辑
这个问题现在好了.它产生了一些高质量的答案.感谢大家,尤其是那些认真对待我的小循环示例的人.大多数怀疑论者都担心缺乏范围.正如@quinmars在评论中指出的那样,你总是可以在循环体上放置大括号.我顺便注意到for(;;)并且while(true)也没有给你免费的大括号(并且省略它们会导致烦恼的错误).无论如何,我不会浪费任何更多的脑力这个小事-我可以用无害的习惯生活for(;;)和while(true)(一样好,如果我想继续我的工作).
考虑到其他反应,我发现许多人认为goto你总是需要以另一种方式重写.当然,你可以goto通过引入一个循环,一个额外的标志,一堆嵌套的ifs或其他什么来避免,但为什么不考虑是否goto可能是这项工作的最佳工具?换句话说,人们准备忍受多少丑陋以避免使用内置语言功能达到预期目的?我的看法是,即使添加一面旗帜,也要付出太高的代价.我喜欢我的变量来表示问题或解决方案域中的事物.'唯一要避免goto'不削减它.
我会接受第一个给出C模式分支到清理块的答案.国际海事组织,这是goto所有已发布答案的最强情况,当然,如果你通过一个仇恨必须通过避免它的扭曲来衡量它.
首先编码测试,我发现我的代码中可能有3/4是单元测试; 如果我真的是极端的,除了修复失败的单元测试之外没有编写一行代码,这个比例会更高.维护所有这些单元测试会增加代码更改的大量惯性.在早期,我把它搞砸并修复它们.一旦有压力,我最终会找到一个broken_unit_tests目录,以便在有时间的情况下重新访问.在设计有时间结晶之前,感觉TDD过早地进行了高覆盖率.
我如何找到摆脱这种困境的方法,并开始欢迎像我应该的那样改变需求?
打印流行节日歌曲的所有12节经文.
在12 节经文中,我的意思是在歌曲中演唱的每一行的重复,即
第一节:在圣诞节的第一天,我的真爱给了我一棵梨树上的鹧..
第二节在圣诞节的第二天,我的真爱给了我两只斑鸠和一棵梨树上的鹧..
...
N:在圣诞节的第n天,我的真爱给了我(没有第一行的第N-1节)(第N行增加了一行)
用g ++ 5.4,这个
struct B {
void f() {}
};
struct D : public B {
void g() {}
};
template <class T>
void foo(void (T::*)(), void (T::*)())
{}
int main()
{
foo(&D::f, &D::g);
}
Run Code Online (Sandbox Code Playgroud)
由于"推断出参数'T'('B'和'D')的冲突类型而失败".为什么不将T推导为D,完全匹配?
在我工作过的每个地方,程序员都带着一张A4硬背书.为了避免吸引注意力,我尽职尽责地携带一个,每次会议一两次,我点头,并假装写下一些有趣的东西.人们偶尔会无人看管他们,我偷偷摸摸一看.大多数情况下,他们似乎正在按照发生的顺序写下他们所做的一切的完整叙述.有些人用"七"中的凯文·斯派西(Kevin Spacey)角色这样的小潦草书写书.
我似乎无法像其他人一样组织这些书.几乎我生成的所有纸张都扔掉了,所以我使用松散的纸张.需要保留的东西最终会出现在设计文档或维基中.TODO最好在我的显示器上跟踪Post-Its.浏览器书签负责处理有关第三方工具的大多数日常信息,等等.
任何拥有有效日志系统的人都可以分享吗?
我有一个主题,提供Subscribe(Observer*)和Unsubscribe(Observer*)提供给客户.Subject在其自己的线程中运行(从中调用Notify()订阅的Observers),并且互斥锁保护其内部的Observers列表.
我希望客户端代码 - 我无法控制 - 能够在取消订阅后安全地删除Observer.怎么能实现这一目标?
编辑
一些说明性代码如下.问题是如何防止在"运行时出现问题"注释时发生取消订阅.然后我可以回拨一个已删除的对象.或者,如果我持有互斥锁而不是制作副本,我可以使某些客户端死锁.
#include <set>
#include <functional>
#include <boost/thread.hpp>
#include <boost/bind.hpp>
using namespace std;
using namespace boost;
class Observer
{
public:
void Notify() {}
};
class Subject
{
public:
Subject() : t(bind(&Subject::Run, this))
{
}
void Subscribe(Observer* o)
{
mutex::scoped_lock l(m);
observers.insert(o);
}
void Unsubscribe(Observer* o)
{
mutex::scoped_lock l(m);
observers.erase(o);
}
void Run()
{
for (;;)
{
WaitForSomethingInterestingToHappen();
set<Observer*> notifyList;
{
mutex::scoped_lock l(m); …Run Code Online (Sandbox Code Playgroud) 我熟悉Java和Lisp的软件包,但是我在其他人的代码中看到的是一些明显的习惯用法,例如调用入口点'-main'并在命名空间名称中使用反引号(in-ns`foo ),那种事.我没有在文档或教程中的任何地方看到这些拼写.是否有一些资源可以解释围绕结构化程序的这些约定?
编辑:
我想我必须从这个答案中找到反击的东西:在多个文件上拆分Clojure名称空间,我在试图理解(defn -main ...)时偶然发现了这个问题.鉴于作者,我把它作为最佳实践.然而,现在我引用他引用的Clojure来源,我发现只使用常规引用.我猜这很可能是一个错字.
(相应地缩小了题目标题的范围)
通过赋值给类属性来实现琐碎的方法有任何风格禁忌或其他缺点吗?例如喜欢bar和喜欢baz,而不是更多的因果foo.
class MyClass(object):
def hello(self):
return 'hello'
def foo(self):
return self.hello()
bar = lambda self: self.hello()
baz = hello
Run Code Online (Sandbox Code Playgroud)
我发现自己被这样的事物的表面经济所诱惑:
__str__ = __repr__ = hello
Run Code Online (Sandbox Code Playgroud) 我刚刚开始使用emacs入门套件和clojure模式.现在,当我(fn在clojure模式下键入或粘贴' '缓冲区时,' fn'字符在窗口中被替换为略微卷曲的小写f.缓冲区被正确保存,但它非常烦人,特别是当我发现这个功能时很困难 - 对某人的'不可能'代码片段感到困惑,然后在光线昏暗之前将其编辑成单行.知道为什么会这样做,或者更重要的是,如何关闭它?