<html lang="en"> <head> <title>The @code{switch} Statement - Untitled</title> <meta http-equiv="Content-Type" content="text/html"> <meta name="description" content="Untitled"> <meta name="generator" content="makeinfo 4.13"> <link title="Top" rel="start" href="index.html#Top"> <link rel="up" href="Statements.html#Statements" title="Statements"> <link rel="prev" href="The-_0040code_007bif_007d-Statement.html#The-_0040code_007bif_007d-Statement" title="The @code{if} Statement"> <link rel="next" href="The-_0040code_007bwhile_007d-Statement.html#The-_0040code_007bwhile_007d-Statement" title="The @code{while} Statement"> <link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage"> <meta http-equiv="Content-Style-Type" content="text/css"> <style type="text/css"><!-- pre.display { font-family:inherit } pre.format { font-family:inherit } pre.smalldisplay { font-family:inherit; font-size:smaller } pre.smallformat { font-family:inherit; font-size:smaller } pre.smallexample { font-size:smaller } pre.smalllisp { font-size:smaller } span.sc { font-variant:small-caps } span.roman { font-family:serif; font-weight:normal; } span.sansserif { font-family:sans-serif; font-weight:normal; } --></style> </head> <body> <div class="node"> <a name="The-%3ccode%3eswitch%3c%2fcode%3e-Statement"></a> <a name="The-_003ccode_003eswitch_003c_002fcode_003e-Statement"></a> <p> Next: <a rel="next" accesskey="n" href="The-_003ccode_003ewhile_003c_002fcode_003e-Statement.html#The-_003ccode_003ewhile_003c_002fcode_003e-Statement">The <code>while</code> Statement</a>, Previous: <a rel="previous" accesskey="p" href="The-_003ccode_003eif_003c_002fcode_003e-Statement.html#The-_003ccode_003eif_003c_002fcode_003e-Statement">The <code>if</code> Statement</a>, Up: <a rel="up" accesskey="u" href="Statements.html#Statements">Statements</a> <hr> </div> <h3 class="section">10.2 The <code>switch</code> Statement</h3> <p><a name="index-g_t_0040code_007bswitch_007d-statement-560"></a><a name="index-g_t_0040code_007bcase_007d-statement-561"></a><a name="index-g_t_0040code_007botherwise_007d-statement-562"></a><a name="index-g_t_0040code_007bendswitch_007d-statement-563"></a> It is very common to take different actions depending on the value of one variable. This is possible using the <code>if</code> statement in the following way <pre class="example"> if (X == 1) do_something (); elseif (X == 2) do_something_else (); else do_something_completely_different (); endif </pre> <p class="noindent">This kind of code can however be very cumbersome to both write and maintain. To overcome this problem Octave supports the <code>switch</code> statement. Using this statement, the above example becomes <pre class="example"> switch (X) case 1 do_something (); case 2 do_something_else (); otherwise do_something_completely_different (); endswitch </pre> <p class="noindent">This code makes the repetitive structure of the problem more explicit, making the code easier to read, and hence maintain. Also, if the variable <code>X</code> should change its name, only one line would need changing compared to one line per case when <code>if</code> statements are used. <p>The general form of the <code>switch</code> statement is <pre class="example"> switch <var>expression</var> case <var>label</var> <var>command_list</var> case <var>label</var> <var>command_list</var> ... otherwise <var>command_list</var> endswitch </pre> <p class="noindent">where <var>label</var> can be any expression. However, duplicate <var>label</var> values are not detected, and only the <var>command_list</var> corresponding to the first match will be executed. For the <code>switch</code> statement to be meaningful at least one <code>case </code><var>label</var> <var>command_list</var> clause must be present, while the <code>otherwise </code><var>command_list</var> clause is optional. <p>If <var>label</var> is a cell array the corresponding <var>command_list</var> is executed if <em>any</em> of the elements of the cell array match <var>expression</var>. As an example, the following program will print ‘<samp><span class="samp">Variable is either 6 or 7</span></samp>’. <pre class="example"> A = 7; switch A case { 6, 7 } printf ("variable is either 6 or 7\n"); otherwise printf ("variable is neither 6 nor 7\n"); endswitch </pre> <p>As with all other specific <code>end</code> keywords, <code>endswitch</code> may be replaced by <code>end</code>, but you can get better diagnostics if you use the specific forms. <!-- Strings can be matched --> <p>One advantage of using the <code>switch</code> statement compared to using <code>if</code> statements is that the <var>label</var>s can be strings. If an <code>if</code> statement is used it is <em>not</em> possible to write <pre class="example"> if (X == "a string") # This is NOT valid </pre> <p class="noindent">since a character-to-character comparison between <code>X</code> and the string will be made instead of evaluating if the strings are equal. This special-case is handled by the <code>switch</code> statement, and it is possible to write programs that look like this <pre class="example"> switch (X) case "a string" do_something ... endswitch </pre> <ul class="menu"> <li><a accesskey="1" href="Notes-for-the-C-programmer.html#Notes-for-the-C-programmer">Notes for the C programmer</a> </ul> </body></html>