Ich weiß, dass der unäre Operator ++ zu einer Zahl eine Eins addiert. Wenn ich ihn jedoch auf einen int-Zeiger anwende, erhöht er sich um 4 (die Größe eines int auf meinem System). Warum ist das so? Zum Beispiel der folgende Code:
int main(void)
{
int *a = malloc(5 * sizeof(int));
a[0] = 42;
a[1] = 42;
a[2] = 42;
a[3] = 42;
a[4] = 42;
printf("%p\n", a);
printf("%p\n", ++a);
printf("%p\n", ++a);
return 0;
}
gibt drei Zahlen mit einer Differenz von 4 zwischen den einzelnen Zahlen zurück.
4 Stimmen
Das ist keine unäre Addition, das ist eine Vorinkrementierung. Die unäre Addition ist ein einzelnes +.
1 Stimmen
Beachten Sie, dass das, was Sie getan haben, ein Speicherleck verursacht hat, weil Sie nicht mehr
free(a);
da er nicht mehr auf den Anfang des zugewiesenen Speichers zeigt. Der Versuch, ihn zu diesem Zeitpunkt freizugeben, wäre ein undefiniertes Verhalten und kann zu einem Segmentierungsfehler führen (wenn Sie Glück haben).0 Stimmen
@Bunnit "Unäre Addition ist ein einzelnes +" -- Nein, genauso wenig wie -x eine unäre Subtraktion ist. Addition und Subtraktion sind binäre Operationen. Ein einzelnes - ist eine Negation; ein einzelnes + ist ein No-op.
0 Stimmen
@Jim Balter. Ok, vielleicht wird "+x" eher als unäres Plus bezeichnet, aber es ist ein Operator, der überladen werden kann, daher ist es nicht immer ein No-Op. Es ist ziemlich klar, dass dies nicht das war, was der OP meinte, denn Pre-Increment wird nie als unäre Addition bezeichnet.
0 Stimmen
Ups C nicht C++ ignorieren den Teil über das Überladen...
1 Stimmen
@Bunnit Eigentlich ist es ganz vernünftig, ++x als "unäre Addition" zu bezeichnen; es ist ein unärer Operator, der eine Addition durchführt. In einer funktionalen Sprache mit Currying kann man etwas wie fn add1 = add(1) oder fn add1 = +(1) schreiben, um eine unäre Funktion zu definieren, die 1 zu ihrem Argument addiert. OTOH, unary "+" macht keine Addition und ist keine unary Addition und wird nie unary Addition genannt -- außer gelegentlich auf SO, wo es bizarrerweise gelingt, 4 Uprates zu erhalten.