Има едно видео за скриптовите езици, което бая ме забавлява :).
Аз се порових, stackoverflow и из стар код. Та.
C++;
1 2 3 4 5 |
auto str = "Let's talk C++"; auto strLength = strlen(str); std::cout << strLength << " ... " << std::endl; if (strLength < -1) std::cout << "WAT." << std::endl; |
Резултат: 14 … WAT.
strlen връща size_t, което бидейки unsigned по стандарт, каства -1 до unsigned, което е всъщност едно доста голямо число :).
if (strLength < -1.f) обаче работи както трябва (понеже по стандарт се каства до най-големия тип с плаваща запетая, ако има такъв).
C++; 11;
1 2 3 4 5 |
auto a = new int(42); auto* b = new int(196); bool starsAreImportant = strcmp(typeid(a).name(), typeid(b).name()) != 0; if (starsAreImportant == false) std::cout << "WAT."; |
аuto като feature ползва механизма на template-ите за определяне на типа. Звездичката, която седи там е безсмислена, но може да я има.
C++;
1 2 3 4 5 |
int *ptr, value = NULL; if (ptr) *ptr = 42; //crash here value = ptr; //compilation error here std::cout << (value + 42); //works fine ... std::cout << "WAT"; |
На първият ред декларираме int* ptr, и int value = NULL – което е все едно:
int* ptr;int value = 0; … Неинициализиран ptr и int със стойност 0. nullptr решава част от недоразумението.
C++;
1 2 |
int i = -1; std::cout << (i >> 1) << " WAT."; |
Недефинирна резултат … Cтандарта указва какво влияние имат битовите операции върху signed типове. В по-голямата си част са undefined, а в другата е доста оплетено.
C++;
1 2 3 4 5 |
int main() { http://code-bg.com std::cout << "WAT."; return 0; } |
Това се компилира. То е етикет за goto с име http, а след него има коментар code-bg.com
C++;
1 2 3 4 5 6 7 8 9 10 11 |
struct Storage { static int const value = 42; }; template<typename T> void bar(T const&){} int main() { bar(Storage::value);//compile time error bar(+Storage::value);//fine std::cout << "WAT."; } |
Унарният оператор + създава копие :).
C++;
1 2 |
volatile int* ptr = new int; std::cout << ptr; //always prints 1 |
std::cout няма предефиниран оператор с volatile .. А понеже всеки указател може да се конвертира до bool, в случая това се случва ..
Останалите за друг път.
А за бонус, този ред:
1 |
typedef int (*(Foo::*bar())[196]); |