【问题标题】:How to break out of a switch in octave?如何打破八度音阶的开关?
【发布时间】:2014-08-12 13:07:47
【问题描述】:

似乎在octave(也许还有matlab)中没有办法打破switch 声明,但我不确定......

P=rand(2,20);
mu=mean(P,2);
dim=2;
plot_mean=false;

for i=1:1

switch (dim)
case 2
        % Print points as dots
        plot(P(1,:),P(2,:),'.');
        if (!plot_mean)
                break;
        endif
        hold on
        % Print mean values as red circles
        plot(mu(1,:),mu(2,:),'or');
        % Quite some more code following here with again several if statements that need to be broken out
case 3
        % Similar for 3D case
        % ...
endswitch

endfor

我刚刚把这个问题变成了一个完整的octave 程序,随时用其他函数调用替换plot 功能。重要的是我在1:1 周围添加了一个for 循环并使用break,但这当然只是一个技巧!

octave中突破switch的正常方法是什么?

【问题讨论】:

    标签: matlab switch-statement octave break


    【解决方案1】:

    也许我错过了您的问题的重点,但break 仅适用于循环。这是你想要做的:

    switch (dim)
    case 2
            % Print points as dots
            plot(P(1,:),P(2,:),'.');
            if (plot_mean)
                hold on
                % Print mean values as red circles
                plot(mu(1,:),mu(2,:),'or');
            end
    case 3
    

    因为否则听起来您正在尝试实施类似“goto”的语句,这是一种不好的做法。而是重组你的代码(如上)。

    我认为这是不可能的,因为正如您的 hack 似乎表明的那样,您可以从一个包含 switch 的循环中 break 来自其中一种情况。这是可能的,因为 Octave/Matlab 没有与 C 相同的失败行为。这些论坛帖子似乎同意,但这并不是确凿的证据:

    但要回答您关于在 Octave 中打破开关的 normal 方式是什么的问题,我想说 normal 方式是将您的代码封装在 @987654327 中@ 语句。

    【讨论】:

    • 那些 switch 语句非常大。所以,我想摆脱他们。用于switch 语句的break 存在于多种语言中,我想知道我是否在octave 中错过了它。
    • 听起来也许你应该重构你的代码,你可以像开关一样打破线性代码。您需要将您希望跳过的代码封装在 if 语句中(如在我的示例中,更长且可能包含更多 ifs)
    • 例如 C# 中的 break 只是因为如果它不存在,该开关将运行所有其他代码。这样您就可以让许多条件执行相同的代码(即case 1: case 4: case 9: do stuff; break;),我不认为它可以用来跳过案例中的代码。对我来说,这听起来是个很糟糕的主意。
    • 开关中的 C/C#/C++ 中的 break 也可以正常工作。不只是区分案例的花哨的东西。
    • goto 在汇编中是不可避免的,在高级语言中确实不建议这样做。我不认为开关是 goto,我认为解释器会连续遍历每个案例并将其视为条件。当然,条件可以编译为 goto,但通常不建议使用高级语言使用 goto 进行显式编程。也许你可以在 Octave 中做到这一点(就像你的 hack),但我认为你应该只是重构。
    猜你喜欢
    • 2011-12-22
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 2012-01-05
    • 2014-11-06
    • 1970-01-01
    相关资源
    最近更新 更多