Hosting and domain costs until October 2024 have been generously sponsored by dumptruck_ds. Thank you!
Difference between revisions of "QuakeC Loops and Conditions"
From Quake Wiki
(→Loop construct) |
|||
Line 29: | Line 29: | ||
statements | statements | ||
}while( expression ) | }while( expression ) | ||
+ | |||
+ | = Extended syntax = | ||
+ | |||
+ | == For-loop construct == | ||
+ | |||
+ | This is an extension supported by most modern qc compilers, basically every qcc since (and including) FrikQCC. | ||
+ | A more complex 'do everything' loop. | ||
+ | |||
+ | for (initialassignment ; conditionexpression ; incrementexpression) | ||
+ | { | ||
+ | statements | ||
+ | } | ||
+ | |||
+ | Which expands to: | ||
+ | |||
+ | initialassignment; | ||
+ | while (conditionexpression) | ||
+ | { | ||
+ | statements | ||
+ | incrementexpression; | ||
+ | } | ||
+ | |||
+ | Note that the initialassignment and incrementexpression can include the comma operator, which allows you to separate multiple statements within a single expression. | ||
+ | |||
+ | The line 'for (i = 0; i < 64; i = i+1)' will thus execute the following code block with i set to the values 0 .. 63 inclusive. i will contain the value 64 after the loop has finished. | ||
+ | |||
+ | Slightly more usefully, the line 'for (e = find(world, classname, "player") ; e ; e = find(e, classname, "player") )' will execute its code block with e set to every single entity that has classname "player". | ||
+ | |||
+ | == Continue Statement == | ||
+ | |||
+ | An extended statement available in every qc compiler since FrikQCC. | ||
+ | |||
+ | A continue statement takes the form: | ||
+ | continue; | ||
+ | When executed, such a statement will jump to the condition part of the containing do-while, or while loops, and will jump to the increment part of a for-loop (see the 'expanded' for-loop example). | ||
+ | |||
+ | Unlike break, continue is unaffected by switch constructs. | ||
+ | |||
+ | == Break statement == | ||
+ | |||
+ | An extended statement available in every qc compiler since FrikQCC. | ||
+ | A break statement takes the form: | ||
+ | break; | ||
+ | When executed, such a statement will jump out of the most inner loop for switch statement. | ||
+ | |||
+ | Note: not to be confused with the break() builtin, which behaves completely differently. | ||
+ | |||
+ | == Switch Construct == | ||
+ | |||
+ | switch(expression) | ||
+ | { | ||
+ | case CONSTANT_1: | ||
+ | statements_1 | ||
+ | break; | ||
+ | case CONSTANT_2: | ||
+ | statements_2 | ||
+ | default: | ||
+ | statements_def | ||
+ | break; | ||
+ | case CONSTANT_3 .. CONSTANT_4: | ||
+ | statements_range | ||
+ | break; | ||
+ | } | ||
+ | |||
+ | If the expression evaluates to CONSTANT_1, the statements_1 line will be executed, followed by the break statement which ends the switch. | ||
+ | If it equals CONSTANT_2, statements_2 will be executed, followed by statements_def, followed by the default's break statement ending the switch. This is refered to as 'falling through' the end of the CONSTANT_2 case, and while perfectly legal is often unintended and best avoided. | ||
+ | If the expression's value is inclusively between CONSTANT_3 and CONSTANT_4, statements_range will be executed, before the break statement ends the switch. This is only valid if the expression evaluates to a float. | ||
+ | If the expression didn't match *any* value, then statements_def will be executed before the following break ends the switch. |
Latest revision as of 18:23, 14 June 2013
Contents
Loops and conditions[edit]
Conditional construct[edit]
if( expression ) { statements } else { statements }
Loop construct[edit]
Pre-test loop: Checks the expression before executing the code within the loop.
while( expression ) { statements }
or post-test loop: Check the expression after the first execution.
do { statements }while( expression )
Extended syntax[edit]
For-loop construct[edit]
This is an extension supported by most modern qc compilers, basically every qcc since (and including) FrikQCC. A more complex 'do everything' loop.
for (initialassignment ; conditionexpression ; incrementexpression) { statements }
Which expands to:
initialassignment; while (conditionexpression) { statements incrementexpression; }
Note that the initialassignment and incrementexpression can include the comma operator, which allows you to separate multiple statements within a single expression.
The line 'for (i = 0; i < 64; i = i+1)' will thus execute the following code block with i set to the values 0 .. 63 inclusive. i will contain the value 64 after the loop has finished.
Slightly more usefully, the line 'for (e = find(world, classname, "player") ; e ; e = find(e, classname, "player") )' will execute its code block with e set to every single entity that has classname "player".
Continue Statement[edit]
An extended statement available in every qc compiler since FrikQCC.
A continue statement takes the form:
continue;
When executed, such a statement will jump to the condition part of the containing do-while, or while loops, and will jump to the increment part of a for-loop (see the 'expanded' for-loop example).
Unlike break, continue is unaffected by switch constructs.
Break statement[edit]
An extended statement available in every qc compiler since FrikQCC. A break statement takes the form:
break;
When executed, such a statement will jump out of the most inner loop for switch statement.
Note: not to be confused with the break() builtin, which behaves completely differently.
Switch Construct[edit]
switch(expression) { case CONSTANT_1: statements_1 break; case CONSTANT_2: statements_2 default: statements_def break; case CONSTANT_3 .. CONSTANT_4: statements_range break; }
If the expression evaluates to CONSTANT_1, the statements_1 line will be executed, followed by the break statement which ends the switch. If it equals CONSTANT_2, statements_2 will be executed, followed by statements_def, followed by the default's break statement ending the switch. This is refered to as 'falling through' the end of the CONSTANT_2 case, and while perfectly legal is often unintended and best avoided. If the expression's value is inclusively between CONSTANT_3 and CONSTANT_4, statements_range will be executed, before the break statement ends the switch. This is only valid if the expression evaluates to a float. If the expression didn't match *any* value, then statements_def will be executed before the following break ends the switch.