Kurze Antwort: Ja, ist möglich und wird normalerweise von Malwareautoren auch so gemacht. (Wobei du PowerShell durch jede andere Skript- / Programmiersprache ersetzen kannst.)

Das Zauberwort heißt "privilege escalation" und dazu gibt es sogar einen Wikipedia-Eintrag, der alles recht gut zusammenfasst:

https://de.wikipedia.org/wiki/Rechteausweitung

Grundsätzlich funktioniert das unabhängig vom Betriebssystem, unabhängig von der eingesetzten Software und der eingesetzten Programmiersprache. Auch VMs und Container sind davor nicht gefeit.

Erst vorgestern gab es dazu einen katastrophalen Bug:

https://www.heise.de/security/meldung/Luecke-in-Container-Runtime-runc-ermoeglicht-Host-Uebernahme-4306487.html

Wie du siehst, kommt das also gar nicht mal so selten vor.

Fazit: Ja, auf Windows gibt es Rechteausweitungen, auch mit Hilfe der PowerShell, und zwar relativ häufig ... geschätzt alle paar Wochen mal. :)

...zur Antwort

Ich bin mir zu 99% sicher, dass es sich um eine Scherzfrage handelt. :)

...zur Antwort

Die ganz billigen Dinger enthalten meist eigens dafür entwickelte ICs, die kaum mehr als die vier Grundrechenarten und ein Display ansteuern können. Diese werden i. d. R. gar nicht / kaum programmiert, sondern sind "fest verdrahtet", und wenn überhaupt kommt ein Assemblerdialekt zum Einsatz.

Bei hochwertigen (grafischen) Taschenrechnern, die diesen Namen auch verdienen, wird oft C / C++ oder ein BASIC-Dialekt genommen, wobei BASIC eher in den Programmen auf dem Taschenrechner angesiedelt ist, und C/C++/Assembler das Betriebssystem stellt. Bei den Z80 basierten Geräten kommt häufig ein Mix aus Assembler und Basic zum Einsatz.

...zur Antwort

Was verstehst du unter "am besten" bzw. "am stabilsten"?

Am effizientesten ist C++, das heißt, wenn du die gleichen Dinge in C++ und C# tust, wird C++ fast immer schneller sein. Ich schreibe "fast", weil es a) auch schlechte C++ Programmierer gibt, die miesen Code schreiben und b) weil ein guter JIT-Compiler viele Dinge extrem gut optimieren kann.

Gehen wir aber von professionellen Entwicklern aus, dann wird C++-Code im Schnitt schneller laufen. :)

C++ ist auch "stabiler" als z. B. C#, Java oder Python, einfach weil es keinen Garbage-Collector gibt, der dir völlig unvorhergesehen dazwischen funkt. Ein GC benötigt zum "aufräumen" selbst Speicher und muss zusätzlich immer 50% des Speichers alloziieren, den die aufzuräumenden Objekte belegen. Und wie jeder gute Entwickler weiß, gibt es kaum eine "teurere" Operation, als Speicherreservierung. Von daher fällt dieses Thema - und damit die häufigste Quelle für Mikroruckler - bei C++ gänzlich flach.

Aaaaaaaber da C++ VIEL mehr Sprachfeatures hat, als z. B. C# und Java zusammen, ist es zwar ein extrem mächtiges Werkzeug, aber eben nicht gerade einsteigerfreundlich. Und aus meiner eigenen Erfahrung muss ich auch leider zugeben, dass die meisten C++-Entwickler ihre Sprache mehr schlecht als recht beherrschen.

Deshalb sind Ergebnisse mit C# und einer Engine (Unity ist momentan beliebt) wesentlich schneller sichtbar, als wenn du C++ einsetzt, und evtl. sogar noch eine Art Engine selbst entwickeln willst. (wobei due Unreal-Engine m. M. n. in den meisten Punkten Unity überlegen ist)

Desweiteren sind Programmierfehler bei C# nicht so katastrophal wie bei C++. Bei ersterem wird oft nur eine Ausnahme geworfen, die man abfangen und behandeln kann. Bei C++ fliegt dir der Prozess um die Ohren und du bekommst u. U. einen Coredump. :)

So, jetzt kannste dir aussuchen, ob du C# oder C++ wählen würdest. Python lasse ich jetzt mal weg, weil das dank GIL eigentlich nur zum Zusammen kleben von Drittengine-APIs zu gebrauchen ist, und Java genau genommen keine Rolle spielt, außer vielleicht einigen Proof-of-Concepts. (Minecraft sieht nämlich deshalb so aus, wie es aussieht, weil es Java ist!)

...zur Antwort

Ich denke, die sind momentan eine der größten Gefahren für die westliche Welt und ein gutes Beispel dafür, dass auch Leute mit Abi oder Uniabschluss sehr "ungebildet" sein können.

Im Gegensatz zu anderen Verschwörungstheretikern gefährden diese Leute alle Menschen um sich herum. Ein Diskutieren ist völlig unmöglich, da sämtliche Argumente an ihnen abperlen.

Erst gestern hat hier irgendwo ein Impfgegner die altbekannten und längst leicht widerlegten Lügen ausgebreitet, u. a. wieder mal das Märchen vom Formaldehyd.

Dass der Körper eines Babies im Schnitt 30000 mal mehr Formaldehyd als Stoffwechselprodukt enthält, als in einer einzigen Impfdosis drin ist, wird dabei völlig ignoriert.

Hier auf GF hat mir auch mal ein Impfgegner auf Nachfrage erklären wollen, dass Masern-Fotos alle gefälscht und Fotomontagen sind, und dass es gar keine Masernviren gibt.

...zur Antwort

Früher hab ich das zu Win32-API-Zeiten auf zwei Arten gelöst:

  1. Auch EXE-Dateien enthalten eine EXPORT-Tabelle und können als DLL fungieren. Mit einigen selbstgebauten Werkzeugen konnte ich DLLs in meine EXE integrieren, und die benötigten Funktionen exportieren, wobei die EXE sie dann von sich selbst aus wieder importiert.
  2. EXE-Dateien störte es früher nicht, wenn Datenmüll am Ende dran hing. So ziemlich alle Installer funktionerten übrigens genau so. Ich habe dann einfach die benötigten DLLs an die EXE rangepappt, zur Laufzeit in den Speicher gemappt, und konnte über einige Umwege auf die exportierten Symbole zugreifen.

Beide Methoden würde ich als höchst unzuverlässig ansehen und da .net-EXE Dateien intern eine völlig andere bzw. stark erweiterte Datenstruktur besitzen, weiß ich ehrlich gesagt nicht, ob das möglich ist.

Allerdings möchte ich wetten, dass man die Exports aus den .net-DLLs rauspopeln und woanders einbauen kann. Das wird dann zwar lustig, dynamische Offsets zu korrigieren, aber früher bei den ollen Win32-DLLs ist mir das auch gelungen ... hab dafür aber wohl gemerkt schon fast einen halben Disassembler schreiben müssen, also einfach wird das ganze sicher nicht, falls du kein fertiges Werkzeug findest. :)

...zur Antwort

Einen 2D-Kreis auf eine Pixelmatrix zu zeichnen ist in der Tat extrem effizient möglich. Dafür benötigt man weder Wurzeln noch trigonometrische Funktionen, sondern nur Addition Multiplikation und zwei Schleifen. Im einfachsten Falle ist die dafür benötigte Funktion 3 Zeilen lang. :)

Aaaaaber auch dieses Verfahren hat einige größere und kleinere Nachteile, vor allem, bei Spielen die auf Dreiecken basieren, und deren Zeichenoperationen komfortabel an die Grafikkarte delegiert werden können.

Wenn du einen Kreis aus Liniensegmenten zeichnen willst, gibt es auch dafür viele verschiedene Ansätze. Alle Ansätze haben gemeinsam, dass sie mehr oder weniger mathematisch korrekt sind. Wenn irgendein Ding für einen Betrachter "rund wie ein Kreis" aussieht, dann ist das völlig ausreichend, wenn dadurch die Zeichenoperation stark beschleunigt werden kann.

Das hat nichts mit "schlampig" programmiert zu tun, sondern einfach nur mit einem Abwägen zwischen Aufwand und Nutzen. Und wenn in einem Spiel ein Kreis eben 32 Ecken hat, dafür das Spiel aber mit 60 fps läuft, ist das doch besser, als hätte der Kreis 4096 Ecken, und am Ende kämen nur 10 fps raus. :)

...zur Antwort

Das sind Debuggingsymbole! Kompiliere mal ohne diese und "strippe" deine ausführbare Datei danach. Dann sollte nichts mehr von Bezeichnern übrig sein. :)

...zur Antwort

Gar nicht.

Die Leute sind krank geworden und gestorben ... oder blieben mit teils schwersten Behinderungen zurück.

Hygiene und Wissen um Krankheitserreger war früher ebenfalls nicht vorhanden ... von daher kann man heutzutage schon dankbar für die Impfungen sein. :)

...zur Antwort

Sei dir bitte darüber im Klaran, dass sich gerade im Bereich "Webdevelopment" die Unfähigsten der Unfähigen Entwickler rumtreiben und jeder Anfänger meint, er wüsste alles und hätte "Erfahrung".

Gerade die billigen kannst du eigentlich alle unter Ulk verbuchen. Gutes, sicheres (!) und qualitativ hochwertiges Webdesign kostet ... und das nicht nur ein einziges mal.

Aber vermutlich wirst du im Meer der grottenschlechten und unfähigen Anbieter ertrinken. Und vermutlich wird man dich mit Marketing-Buzzword-Bullshit-Bingo so dermaßen einlullen, dass du irgendeinen hippen Müll kaufen wirst, mit dem du langfristig aber nicht glücklich werden wirst.

Im Webdesign Bereich gibt es sicherlich noch mehr Dilettanten und Betrüger als unter den Staubsaugerverkäufern und Wünschelrutengängern.

Also fall bitte nicht auf irgendwelche "hippen Startups" aus "Berlin-Mitte" mit "jungem und engagierten Team" herein, die so tun, als würden sie tatsächlich Qualität für n Appel und n Ei verkaufen.

You get, what you pay for. ;)
...zur Antwort

Wenn du ein Array mit 100 Mio. Einträgen hast, und du willst einen einzigen Eintrag anfügen, muss realloc() den ganzen Klimmbimm umkopieren. Bei einer Liste wird kurz und knapp einfach nur das neue Element ans Ende angefügt.

Außerdem ist ein Array eigentlich immer etwas zu groß ... eine Liste hingegen hat immer die perfekte Größe.

Ein Array arbeitet u. U. aber schneller, aber dafür gibt es ja Datenstrukturen, die Arrays mit Listen kombinieren. Für mehr gibts dann noch Bäume, Maps, Sets, usw. usf.

realloc() ist verglichen mit dem einfach anfügen an eine Liste viel viel "teuer" und benötigt gerne 10000 mal oder mehr so viel Zeit.

...zur Antwort

Noch eine zweite Antwort, weil ich deine Frage evtl. nicht richtig verstanden hatte.

Falls du etwas für genau 3 Sekunden lang laufen lassen, und danach sauber beenden willst, mach es mit C++ Bordmitteln so:

#include <atomic> // atomic_bool
#include <chrono> // high_resolution_clock, seconds
#include <iostream> // cout, endl
#include <thread> // current_thread, thread

#include <cstdlib> // size_t

::std::atomic_bool going { true };

void calc() {
  size_t i {};

  while (going) {
    using namespace ::std;

    cout << "Round: " << ++i << endl;
  }
}

int main(void) {
  using namespace ::std;
  using namespace ::std::chrono;

  const unsigned secs { 3 };

  cout << "Working for " << secs << " secs ..." << endl;
  thread worker { calc };

  this_thread::sleep_for(seconds { 3 });
  going = false;

  worker.join();
  cout << "Done." << endl;
}

Bei so einem kleinen Schnipsel gibt es zwar keine weiteren Probleme, aber mach dir bitte bewusst, dass du dich später evtl. um Synchronisierung kümmern musst.

...zur Antwort

Mit C++ Bordmitteln ganz kurz und knapp so:

#include <chrono> // high_resolution_clock, seconds
#include <iostream> // cout, endl, flush
#include <thread> // current_thread

int main(void) {
  using namespace ::std;
  using namespace ::std::chrono;

  const unsigned secs { 3 };

  cout << "Sleeping " << secs << " secs ..." << flush;

  const auto now = high_resolution_clock::now();
  this_thread::sleep_until(now + seconds { 3 });

  cout << " done." << endl;
}

Man sagt C++ zwar oft nach, extrem kryptisch zu sein, aber der obige Code sollte selbst für absolute Einsteiger selbsterklärend sein. :)

...zur Antwort

Neben dem, was die anderen schon geschrieben haben:

C++ übersteigt vom Spachumfang her bei weitem C#, Java und erst recht PHP. Die Standardbibliotheken von Java und C# sind hingegen wesentlich umfangreicher, als die von C++. PHP ist sowohl vom Sprachumfang, als auch vom Umfang der Standardbibliothek her, recht "mager".

C++ ist sehr "mächtig" und diese Sprache bietet neben dem OOP-Ansatz noch viele weitere, wie funktionales, generisches, oder einfach prozeduales Programmieren. Deshalb hat "Bjarne Stroustrup" in seinem Buch "Die C++ Programmiersprache" gleich zu Anfang klar gestellt, dass C++ keine reine OOP- sondern ausdrücklich eine Multiparadigmen-Sprache ist.

Falls dich das als Einsteiger jetzt umhaut, dann merke dir einfach, dass du mögliche anfallende Probleme auf wesentlich mehr grundsätzliche Arten lösen kannst, als in anderen Programmiersprachen. :)

Die funktionalen Elemente von C++ sind allerdings nicht so mächtig, wie die von Haskell oder Lisp. Auf der anderen Seite sind die generischen Möglichkeiten von C++ viel viel viel mächtiger, als das, was bei Java oder C# als "Generics" bezeichnet wird.

Mit Ausnahme von Pointer-Aliasing kannst du in C++ den Code mit der besten Performance schreiben, wobei dir die sogenannte Template-Meta-Programmierung behilflich sein wird. Diese Kombination aus ausgereiften Compilern und modernen Sprachfeatures findest du sonst bei keiner anderen Programmiersprache. Sei dir aber darüber im Klaren, dass JIT-Compiler viele Dinge extrem gut optimieren können, und z. B. ein Java-Codeabschnitt gerne mal schneller laufen kann, als ein Stück mittelmäßiger C++ Code.

C++ ist sehr mächtig, sehr umfangreich, und für Einsteiger deshalb oft schwerer greifbar, wie die Konkurrenz: C#, Java, Python, etc.

Aber da jede Sprache sowieso ihre Vor- und Nachteile hat, lohnt es sich durchaus, mehrere zu beherrschen, wobei "beherrschen" bedeutet, sich intensiv pro Sprache mindestens zwei, drei oder mehr Jahre damit beschäftigt zu haben.

Falls du hardwarenahe Sachen, wie Spiele, programmieren willst, und darunter nicht nur "API-Code zusammen kleben" verstehst, dann kommst du um C++ sowieso nicht drum herum. Eine eigene Engine wirst du nicht mal ansatzweise so gut in anderen Sprachen hinbekommen.

Falls du hingegen schnell Ergebnisse sehen willst, reicht C# völlig aus.

Allerdings bietet dir - neben C und eben C++ - keine andere Hochsprache so ein tiefgehendes Verständnis im Bezug auf Speicherverwaltung und die internen Abläufe.

Um es überspitzt zu formulieren: Deshalb kannst du C# oder Java-Programmierer auch als Weicheiner ansehen, die gerne in Watte gepackt, und die vor den "gefährlichen" Funktionen ihrer Sprachen geschützt werden wollen. C++ler sind nicht solche Pussies, und die überleben eben auch mal einen Segfault ... man lernt ja schließlich was draus. ;)

(Für den vorherigen Absatz bekomme ich jetzt bestimmt etwas auf die Nase!) :)

Fazit: Alle Sprachen haben sowohl Vor-, als auch Nachteile. Und noch viel wichtiger ... sie haben unterschiedliche Einsatzgebiete, die sich im Sprachdesign, den Paradigmen / Ansätzen und der Funktionalität wiederspiegeln.

C++ ist eine sehr gute universelle Sprache (vor allem die neuesten Versionen seit C++11, vorzugsweise C++17!) und ein sehr mächtiges Werkzeug. Sie ist für Anfänger definitiv etwas schwieriger zu lernen, als C# oder Java, aber da du ja schon mit PHP Vorkenntnisse hast, sollte das für dich durchaus machbar sein.

Außerdem gibt es weltweit nicht wenige Anfänger, die mit C++ beginnen. :)

Naja, beachte bitte auch die anderen - teils sehr guten - Antworten hier! Viel Spaß beim Lernen! :)

PS: Ich habe mich an der einen oder anderen Stelle evtl. nicht allzu anfängerfreundlich ausgedrückt. Falls du etwas nicht verstehst, ignoriere es einfach ... irgendwann wirst du es sowieso lernen. :)

...zur Antwort

In den meisten Fällen wird nur ein Zweig ausgeführt, es sei denn, deine Programmiersprache erlaubt Schweinereien, wie das hier zum Beispiel:

#include <stdio.h> // printf, puts

#define if(junk)
#define else

int main(void) {
  int i = 0;

  printf("i = %d ...\n", i);

  if (i < 0) {
    puts("i < 0");
  } else if (i > 0) {
    puts("i > 0");
  } else {
    puts("i == 0");
  }

  return 0;
}

Das liefert folgende Ausgabe:

i = 0 ...
i < 0
i > 0
i == 0

Wie du siehst, werden alle Zweige genommen. :)

Ansonsten überlege dir vielleicht mal, wofür if, else if und else ursprünglich gedacht sein könnten. :)

...zur Antwort

Umlaute funktionieren bei normalen C sowieso nicht auf portable Art und Weise, deshalb solltest du dich auf die Buchstaben von A bis Z beschränken:

/*
gcc -std=c11 -O0 -g -Wall -Wextra -Wpedantic -Werror foo.c
*/

#include <stdio.h> /* puts */
#include <stdlib.h> /* size_t */

static inline char swap_case(const char c) {
  return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') ? c ^ 0x20 : c;
}

int main(void) {
  char buf[] = { "foo 123 BAR Baz QuuX :)" };

  puts(buf);

  const size_t len = sizeof(buf) / sizeof(*buf);

  for (size_t i = 0; i < len; ++i) {
    buf[i] = swap_case(buf[i]);
  }

  puts(buf);

  return 0;
}

Beachte hierbei die Funktion swap_case() am Anfang, welche dir Groß- in Klein- und Klein- in Großbuchstaben umwandelt.

Falls du doch mit Umlauten arbeiten willst, kommst du nicht drum herum, dich mit Locales oder besser noch erweiterten Bibliotheken zu beschäftigen.

...zur Antwort

Wenn auch oft nicht direkt, sondern indirekt: Ja, alle Klassen erben von Object.

Aber da Enums, Interfaces oder primitive Typen wie int, bool, double, etc. keine Klassen sind, erben diese auch nicht von Object ... nur um das nochmal deutlich zu machen. :)

Der Vollständigkeit halber sei noch erwähnt, dass es mit schmutzigen Hacks möglich ist, Objekte zu erzeugen, die NICHT von Object erben. Aber da das einen Mix aus JNI und einer Anpassung der JVM mit sich zieht, ist das nicht portabel und auch nichts für Einsteiger. Falls überhaupt, hört man davon nur etwas in Vorträgen auf Hacker-Kongressen, aber 99,99% aller Java-Profis werden NIE damit in Berührung kommen.

Von daher: Ja, alle Klassen erben von java.lang.Object. :)

...zur Antwort