vereinfacht: Variable bezeichnet eine (logische) Speicherzelle
genauer: Variable besitzt Attribute
Bindungen dieser Attribute statisch oder dynamisch
e = 
, sin = (x
(- 1)n
)
in der Programmierung:
long_name oder longName (camel-case)
(Fortran: long name)
im Zweifelsfall: Konvention der Umgebung einhalten
schlecht: myStack = ...
besser: Stack<Ding> rest_of_input = ...
z. B. var in C#3
Vor/Nachteile: Lesbarkeit, Sicherheit, Kosten
Daten sind typisiert, Namen sind nicht typisiert.
LISP, Clojure, PHP, Python, Perl, Javascript, ...
<html><body><script type="text/javascript">
var bar = true;
var foo =
bar ? [1,2] : function(x) {return 3*x;};
document.write (foo[0]);
</script></body></html>
Daten sind typisiert, Namen sind typisiert
C, Java, ...
ML, F#, Haskell, C# (var)
public class infer {
public static void Main (string [] argv) {
var arg = argv[0];
var len = arg.Length;
System.Console.WriteLine (len);
}
}
Beachte: das var in C# ist nicht
das var aus Javascript.
im einfachsten Fall (Java, C#):
Typname Variablenname [ = Initialisierung ] ;
int [] a = { 1, 2, 3 };
Func<double,double> f = (x => sin(x));
gern auch komplizierter (C): dort gibt es keine Syntax für Typen, sondern nur für Deklarationen von Namen.
double f (double x) { return sin(x); }
int * p;
double ( * a [2]) (double) ;
Beachte: * und [] werden „von außen nach innen `` angewendet
Ü: Syntaxbäume zeichnen, a benutzen
=
Vorsicht:
Merksatz: alle Deklarationen
so lokal und so konstant wie möglich!
(D. h. Attribute immutable usw.)
=
Üblich ist: Sichtbarkeit beginnt
nach Deklaration
und endet am Ende des umgebenden Blockes
Namen sind auch in inneren Blöcken sichtbar:
innere Deklarationen verdecken äußere:
...stimmen nicht immer überein:
sichtbar: in Funktion, Leben: Programm
sichtbar: innere Blöcke, Leben: bis Ende Unterpr.
class C { int foo; }
static void g (final C x) { x.foo ++; }
int f (int x) {
static int y = 3; y++; return x+y;
}
{ int x = ... }
int x;
while (..) {
int y;
... x + y ...
}
int x;
while (..) {
int x;
... x ...
}