Zunächst einmal gibt es keinen besonderen Grund für Ihre Variablen b05
und b06
genannt werden, also lassen Sie uns verwenden a
und b
, es weniger hässlich aussieht.
Grundsätzlich möchten Sie eine Kopie Ihres Wertepaares (zwei Eingänge, 49
und 13
) erstellen und eine Kopie an den Code übergeben, der sie ändert.
Die einfachste Lösung ist, dass Sie zwei zusätzliche Variablen erstellen, weisen Sie Ihre Werte zu ihnen:
int a0 = 49, b0 = 13;
und sie dann jedes Mal, die Sie verwenden möchten, können Sie die Zuordnung kopieren:
a = a0; b = b0;
Dies vermeidet doppelte Konstanten (Sie geben nur 49
und 13
einmal), aber Sie müssen immer noch Operatoren kopieren, die Variablen kopieren. Mit struct
(1):
Alle weiteren Verbesserungen werden Sie diese Kopie nicht zulassen, vermeiden, hat es noch vor jeder Operation durchgeführt werden, aber Sie können einige Quellcode Duplizierung mit ein paar Tricks vermeiden.Das lässt Sie zwei Werte in einem kapseln:
struct params {
int a;
int b;
}
params p0;
p0.a = 49;
p0.b = 13;
params p;
...
p = p0;
p.a += p.b; // p.a = p.a + p.b
cout << "(+=) compound assignment: " << p.b << endl;
...
Jetzt sind Sie nur einen Befehl p = p0
statt zwei zu wiederholen.
(2) Mit Wertparameter:
void test1(int a, int b) {
a += b; cout << "(+=) compound assignment: " << a << endl;
}
void test2(int a, int b) {
a -= b; cout << "(-=) compound assignment: " << a << endl;
}
...
int main() {
int a = 49; int b = 13;
test1(a, b);
test2(a, b);
...
return 0;
}
Obwohl nicht explizit die Zuweisung erfolgt a und b, die Kopie immer noch jedes Mal: aktuelle Parameter a
und b
von main
werden in formalen Parametervariablen von Funktionen kopiert, zufällig auch a
und b
genannt.
(3) Sie können vermeiden, Code mit Funktionsreferenzen zu duplizieren. Hier ist ein Beispiel mit Array von anonymen Funktionen für jede Operation:
typedef int OperationFn(int, int)
struct OperationInfo {
std::string label;
OperationFn op;
}
OperationInfo operations[9] = {
{ "+=", [](int a, int b) { return a += b } },
{ "-=", [](int a, int b) { return a -= b } },
{ "*=", [](int a, int b) { return a *= b } },
{ "/=", [](int a, int b) { return a /= b } },
{ "%=", [](int a, int b) { return a %= b } },
{ ">>=", [](int a, int b) { return a >>= b } },
{ "<<=", [](int a, int b) { return a <<= b } },
{ "&=", [](int a, int b) { return a &= b } },
{ "^=", [](int a, int b) { return a ^= b } },
}
int main() {
for (int i = 0; i < 9; i++) {
const OperationInfo& oi = operations[i];
cout << "(" << oi.label << ") compound assignment: ";
cout << oi.op(49, 13) << endl;
}
return 0;
}
Der Code erwähnt Parameterersetzung nur einmal (oi.op(49, 13)
Linie), aber es ist in einer Schleife, so dass er effektiv alle 9 mal ausgeführt wird. Während Code sauberer und kompakter aussieht, gibt es keinen Effizienzgewinn: Sie kopieren immer noch beide Werte vor jedem Test. obwohl
Eine Optimierung ist möglich: Sie einen gemeinsamen const Wert für das zweite Argument verwenden, weil es nie geändert hat:
const int b = 13;
und dann nicht b
um es passieren, nur b
verwenden.
Hinweis: Verzeihen Sie meine Tippfehler. Ich habe keinen Compiler zur Hand, also kann ich diesen Code nicht überprüfen. Es kann kleinere Fehler geben. Hinterlassen Sie Kommentare, wenn Sie sie finden, ich werde meinen Beitrag aktualisieren.
Sie müssen * b06 nicht erneut zuweisen, es wird nicht durch die zusammengesetzte Operation geändert. – kfsone
Dieser Code sieht komisch aus, komisch, komisch. –