OT Ceckarsky kviz

Miroslav Mraz mrazik na volny.cz
Čtvrtek Leden 27 14:46:54 CET 2022


Zřejmě to závisí na překladači. V C++ jdou dělat i větší zvěrstva např.

#include <stdio.h>
#include <cmath>
// Compile: clang++ -std=c++14 -Oz
static constexpr double operator"" _deg (const long double arg) {
   return arg * M_PI / 180.0;
}
// Velká písmena v názvu operátoru jsou vyhrazena ...
static constexpr unsigned long operator"" _h (const char * const str, 
size_t n) {
   unsigned long result = 0ul;
   for (unsigned i=0u; i<n; i++) {
     const char c = str [i] | '\x20';  // to lowercase
     if ((c >= '0') and (c <= '9')) {
       result *= 0x10ul;
       result += c - '0';
     } else if ((c >= 'a') and (c <= 'f')) {
       result *= 0x10ul;
       result += c - 'a' + 10;
     } // ostatni znaky jako je '_' ignoruj
   }
   return result;
}
int main () {
   // Tohle by mohlo mit nejaky smysl.
   constexpr double  args [] = { 30._deg, 45._deg, 60._deg, 0.5 * M_PI };
   for (auto & arg : args) ::printf ("sin (%f) = %f\n", arg, std::sin(arg));
   // Tohle uz je docela pitomost, gcc (a jine) s tim bude mit problem, 
clang OK.
   constexpr unsigned long n = "DEAD_beef_CAFE_babe"_h;
   constexpr unsigned long m = 0xdEaDbEeFcAfEbAbE;
   static_assert (m == n, "not equal"); // opravdu je to spocteno pri 
prekladu
   printf("0x%lX\n", "hello world"_h);  // prevede se i nesmysl, ale proc ne
   printf("%f\n", 0x1C2D.3EP4F);        // projde i tahle hruza - 115411.875
   return 0;
}

V řádce s poznámkou "to lowercase" je možná odpověď na otázku proč je to 
někde case insensitive. Trochu to zkrátí kód parseru. Takže v C++ si 
můžete napsat vlastní parser konstanty. Možná se to hodí na obfuskaci 
kódu, ale prakticky bych se tomu vyhnul, čitelnost kódu je pak dost 
bídná, obzvlášť když ty operátory definujete někde v hlavičce na 10. 
úrovni zanoření.
Připadá mi, že je lépe psát deg_to_rad (30.) jako funkci (která může být 
též constexpr) než operátor 30._deg. Sice se může zdát, že to takhle 
můžete napsat i v C-čku, ale není tomu tak. Constexpr výrazy se 
vyhodnotí při překladu, takže výsledný kód tím není zaplevelen. Dají se 
s tím dělat různá kouzla https://kizarm.github.io/constexpr/index.html, 
ale je to takové ... no divné.

Mrazík

Dne 27. 01. 22 v 14:19 Jan Waclawek napsal(a):
> ...
> A tiez pise, ze v C++ tie hexadecimal float konstanty nie su, ale to uz nie
> je pravda lebo to pribudlo v C++17.
> 
> wek
> 


Další informace o konferenci Hw-list