11.07.2014 Views

C programming notes - School of Physics

C programming notes - School of Physics

C programming notes - School of Physics

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

C <strong>programming</strong> <strong>notes</strong><br />

file:///F:/my_docs/web_phys2020/C<strong>programming</strong><strong>notes</strong>.html<br />

18 <strong>of</strong> 40 19/03/2007 10:06 AM<br />

() [] ->> . left-to-right<br />

- + ++ -- ! ~ * & size<strong>of</strong> (type) right-to-left (note: unary +, -, *, and &)<br />

* / % left-to-right<br />

+ - left-to-right<br />

> left-to-right<br />

< >= left-to-right<br />

== != left-to-right<br />

&<br />

left-to-right<br />

^<br />

left-to-right<br />

| left-to-right<br />

&&<br />

left-to-right<br />

|| left-to-right<br />

?: right-to-left<br />

= += -= *= /= %= &= ^= |= = right-to-left<br />

, left-to-right<br />

Note: the unary operators + (introducing a positive number), - (introducing a negative number), * (pointer<br />

dereferencing), and & (address <strong>of</strong>); appear twice in the above table. The unary forms (on the second line) have higher<br />

precedence that the binary forms.<br />

Operators on the same line have the same precedence, and are evaluated in the order given by their associativity.<br />

To specify a different order <strong>of</strong> evaluation you can use parentheses. In fact, it is <strong>of</strong>ten good practice to use parentheses to<br />

guard against making mistakes in difficult cases, or to make your meaning clear.<br />

Side effects in evaluating expressions<br />

It is possible to write C expressions that give different answers on different machines, since some aspects <strong>of</strong><br />

expression-evaluation are not defined by the ANSI standard. This is deliberate since it gives the compiler writers the<br />

ability to choose different evaluation orders depending on the underlying machine architecture. You, the programmer,<br />

should avoid writing expressions with side effects.<br />

Here are some examples:<br />

myfunc(j, ++j); /* the arguments may be the same, or differ by one */<br />

array[j] = j++; /* is j incremented before being used as an index? */<br />

i = f1() + f2(); /* the order <strong>of</strong> evaluation <strong>of</strong> the two functions<br />

is not defined. If one function affects the<br />

results <strong>of</strong> the other, then side effects will<br />

result */<br />

Evaluation <strong>of</strong> logical AND and OR<br />

A useful aspect <strong>of</strong> C is that it guarantees the order <strong>of</strong> evaluation <strong>of</strong> expressions containing the logical AND (&&) and<br />

OR (||) operators: it is always left-to-right, and stops when the outcome is known. For example, in the expression "1 ||<br />

f()", the function "f()" will not be called since the truth <strong>of</strong> the expression is known regardless <strong>of</strong> the value returned by<br />

"f()".<br />

It is worth keeping this in mind. You can <strong>of</strong>ten speed up programs by rearranging logical tests so that the outcome <strong>of</strong><br />

the test can be determined as soon as possible.<br />

Another good example is an expression such as "i >= 0 && i

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!