Pandemieseuchenpest des tages

Queen Elizabeth II. hat sich mit dem Coronavirus infiziert. Die 95 Jahre alte britische Königin spüre „milde, erkältungsähnliche Symptome“, wolle aber in der kommenden Woche in Windsor weiter „leichte Aufgaben“ ausführen, teilte der Buckingham-Palast mit

[Archivversjon]

Hätte sie sich vielleicht doch besser eine maske über die fresse gezogen, als sie neulich ihr siebzigjähriges jubiläum als obermotzin großbritannjens, g’tterwählte königin, verteidigerin des glaubens und so weiter feierte?

Smartding des tages

Ist schon bitter, wenn die „smarte“ klingel im winter nicht funkzjoniert, weil der akku nicht geladen werden kann. Aber keine sorge, das problem kann „gelöst“ werden:

Als Lösung schlägt man vor, dass die Klingel abgenommen wird und der Nutzer jene mit ins Warme nimmt, um sie dort wieder aufzuladen

Ach ja, zu warm darf die klingel auch nicht werden, also bitte für schatten an der tür sorgen. Vierzig grad sind in der hellen jahreshälfte im prallen sonnenlicht schnell erreicht. Vermutlich wird guhgell demnächst spezjelle türklingel-sonnenschirme verkaufen.

Immer wieder schön, wie sich die leute lösungen ohne problem verkaufen lassen, die dann nur probleme machen. Normale, „nichtsmarte“ klingelanlagen sind ja ziemlich wetterunabhängig und funkzjonieren einfach…

i ist größer als j

#include <iostream>
int main()
{
    int i = -1;
    unsigned int j = 1;
    if (i < j)
        std::cout << " i ist kleiner als j\n";
    else
        std::cout << " i ist größer als j\n";
    return 0;
}

Ja, ich kenne den ternären operator! Ich wollte es lesbar haben. 😉️

Oder in anderen worten: warum man beim kompilieren besser mit -Wall alle warnungen einschaltet, und zwar am besten schon, bevor ein obskurer fehler auftritt, und warum man versucht, die warnungen zu verstehen und zu behandeln. Ein anständiger kompeiler schmeißt für so etwas natürlich eine deutliche warnung raus…

$ c++ -Wall -o ij ij.cpp
ij.cpp: In function ‘int main()’:
ij.cpp:6:11: warning: comparison of integer expressions of different signedness: ‘int’ and ‘unsigned int’ [-Wsign-compare]
    6 |     if (i < j)
      |         ~~^~~
$ _

…während man bei statischen kohdanalyse-programmen erstmal in oft hunderten, sehr schwer interpretierbaren ausgabezeilen die eine finden muss, die das problem beschreibt¹. Nichts gegen lint, aber das dingens ist ein pedant! Und zudem ist C++ extrem schwer zu parsen, sogar für einen kompjuter. Da würde ich mich lieber auf den kompeiler und seine warnungen verlassen. Leute, die kompeiler programmieren, wissen sehr genau, was sie tun und was probleme machen könnte.

Ich bin mir nicht sicher, ob dieses von einem bekannten als völlig unverständlicher fehler „gefundene“ und auch nach längerer debugger-sitzung nicht durchschaute verhalten bei einem impliziten cast auch „portabel“ ist, halte es aber für sehr wahrscheinlich. Aus solchen feinheiten des standards bin ich zum glück seit jahren draußen. Nach meiner bescheidenen meinung sind implizite casts mit manchmal lustigen seiteneffekten eine erfindung aus der hölle, die inzwischen übrigens auch beim altmodischen C-programmieren überraschen kann. Ich habs eben schnell mit gcc 9.3.0 getestet.

Wer sich mit C oder C++ kwälen muss oder will: niemals vorzeichenbehaftete und vorzeichenlose variablen unvorsichtig miteinander vergleichen, es kann nur probleme dabei geben! Aus -1 wird im zweierkomplement nun einmal 0xFFFFFFFFFFFFFFFF, oder bitbreitenunabhängiger gesagt, UINT_MAX. Und wenn das auf einmal vorzeichenlos ist, dann ist es niemals kleiner als ein anderer unsigned int. Und natürlich immer mit -Wall (oder einem klick auf die entsprechende tscheckbox in der IDE) kompilieren!

¹Es war ein längeres kohdfragment als meine paar zeilen, die auf dem punkt kommen wollen.