Understanding Code You Didn't Write // Code Review

Поділитися
Вставка
  • Опубліковано 25 лис 2024

КОМЕНТАРІ • 125

  • @TheCherno
    @TheCherno  2 роки тому +15

    This is Part 2! Watch Part 1 here: ua-cam.com/video/eNSkYAzC_ew/v-deo.html
    Keep exploring at brilliant.org/TheCherno/ Get started for free, and hurry-the first 200 people get 20% off an annual premium subscription.

    • @lengors7327
      @lengors7327 2 роки тому

      Do you accept java code for the code review series?

    • @anthonysteinerv
      @anthonysteinerv 2 роки тому +2

      @@lengors7327 You definitely need some love if you really do program on Java.

  • @Stowy
    @Stowy 2 роки тому +92

    Thanks a lot for looking at my code again ! These feedbacks and tips definetly where super usefull ! (although i'm very nervous that so many people sees it haha)
    I'll try to fix the problem with the header files and the wrong usage of structs tonight, so if you want you can pull my changes before an (hypothetical ?) part 3.

    • @Thebreak1
      @Thebreak1 2 роки тому +5

      Just pointing out:
      Your full name and email are in the video, are you okay with that? 😅

    • @Stowy
      @Stowy 2 роки тому +9

      @@Thebreak1 Didn't really think about it, but yeah it's okay, it was already public on github before that haha

    • @Stowy
      @Stowy 2 роки тому +3

      @@caoinismyname yeah i see what you mean, but this is also kinda the rule I tried to follow, even in C# for example. Just that when I followed the tutorial form Winterdev, classes and structs where kinda mixed up together and I was scared to change it in case it was for a valid reason later in the tutorial.

    • @Thebreak1
      @Thebreak1 2 роки тому +1

      @@Stowy Well in C# you cant have an empty constructor for a struct. One thing I was annoyed of, because I needed an empty one to store 4 different variables that also know if they were assigned or not.

    • @Spero_Hawk
      @Spero_Hawk 2 роки тому +2

      @@Stowy While you're learning is the best time to make changes, even if you are scared it will mess things up. Sometimes changing something helps to better understand what you're learning. If it does mess up later and you can change it back then you truly understand the logic of the code and aren't just parroting the tutorial.

  • @roxasora929
    @roxasora929 2 роки тому +31

    I dont code much so I have no idea what you're all talking about, but Stowy is my friend and I'm very proud of him and his work being celebrated and featured here

    • @rmt3589
      @rmt3589 Рік тому +2

      That's a solid friend move. Good looking out!

  • @muumitramm
    @muumitramm 2 роки тому +154

    Understanding Code You Didn't Write. Next day realizing it still was me.

    • @cyqry
      @cyqry 2 роки тому +14

      Don't comment your code and you'll have this experience every time you look at something you wrote more than three weeks ago!

    • @muumitramm
      @muumitramm 2 роки тому +7

      @@cyqry git blame

    • @cyqry
      @cyqry 2 роки тому +2

      @@muumitramm That's a new one for me and I love the name, like they know *exactly* why you would use that.

    • @anon_y_mousse
      @anon_y_mousse 2 роки тому

      @@muumitramm Yeah, but it's always DNS.

    • @Spero_Hawk
      @Spero_Hawk 2 роки тому +10

      If (x != y && x

  • @Winterdev
    @Winterdev 2 роки тому +19

    Thanks for the shout out! When I first moved from C# to C++ my first project was to make a game and I used your tutorials to create the first versions of the engine. If you look into the repo you can see traces of your layer model :) I don't know why that physics engine video blew up, but it's awesome to see it come full circle!

    • @Stowy
      @Stowy 2 роки тому +5

      Thanks a lot for the tutorial, it helped me so much to have a good grade for this project haha

    • @Winterdev
      @Winterdev 2 роки тому +3

      @@Stowy Nice! I've mined the physics engine knowledge for many As throughout the years haha

    • @rmt3589
      @rmt3589 Рік тому +1

      ​@@WinterdevUnless there's a part 3, I'll be watching your tutorial next.
      It should be good for helping me understand physics engines better, even if I use a framework!

  • @DesignCell
    @DesignCell 2 роки тому +11

    +1 for self documenting code! Comments can lie when not updated but code never lies.

    • @Turalcar
      @Turalcar 5 місяців тому +1

      Code can lie if you don't run it. That's why I'm in the habit of removing dead code wherever I can find it.

  • @fenril6685
    @fenril6685 2 роки тому +38

    C++ style casts are encouraged because they make explicit exactly which casting behavior is intended. There are inherent benefits to using them over C-Style casts, especially on projects which have multiple developers touching the code base.
    There are many cases in which complicated runtime casting can be vague if you are not explicit such as: (std::byte*)&integers[index] where integers is some container like an std::array. The above is NOT a static cast and is a reinterpret cast which can be a very error prone cast if you don't know exactly what you are doing. The benefit of explicitly using reinterpret_cast(&integers[offset]), is that you are "self-documenting". You might see such casting in low level optimizations when you're working on something like Serialization code to translate a variety of data types into and from a block of raw memory.
    This tells anyone looking at your code: hey this is special cast we are treating the value at this memory address as a different data type that it normally is not meant to be treated as! Especially if you work on a large code base where you may have multiple authors potentially contributing to code this sort of explicit casting is preferable, because it is less error prone and tells other people "pay attention to what is actually going on here and if you don't know what this is explicitly doing go look it up". This can help prevent bugs being introduced by some other contributing developer.
    Similar cases are common with the use of dynamic_cast. We want to clearly express "Hey we know because of some condition check or other control flow that this variable should be a derived type here at this point in the code." It also makes clear to any other developer where potential performance bottlenecks might be located at because they can see this is a run time polymorphic cast, if we are doing a lot of function calls off this we are probably doing a lot of vtable lookups here in this area.
    Thirdly, searching through a codebase for "dynamic_cast

    • @kmint1331
      @kmint1331 Рік тому

      In terms of the ranged for loops, I prefer to use your second solution and make the key variable to be just an underscore to specify that it wasn't used as I do agree with the video that the | std::views code makes the code really unreadable.

  • @debmalyamitra353
    @debmalyamitra353 2 роки тому +2

    THAT'S THE SMOOTHEST TRANSITION INTO A SPONSOR THAT I HAVE SEEN!! DAMN

  • @thesupercomputer1
    @thesupercomputer1 2 роки тому +25

    Absolutely agree on the Struct theme.
    For me structs are data, maybe with functions to accept ony specific data, but still data.
    classes on the other hande are there to manipulate data.
    So in my code I can clearly distinguish between the the two and easily identify whether or not data could be changed by it.

  • @talhaibnemahmud
    @talhaibnemahmud 2 роки тому +11

    Definitely a 3rd part needed. I just love this guys code quality 😍

  • @spudgossie
    @spudgossie 2 роки тому +1

    I agree with you on the struct vs class. The class keyword hints that C++ happens here where a struct would normally be a POD or something that allows passing to C code

  • @on-hv9co
    @on-hv9co 2 роки тому +3

    I tend to agree with the separation between struct and class. When i think struct it's something that gets operated on like a data STRUCTure. Classes on the other and are the operators that work on the structures.

  • @andreyprotsenko9855
    @andreyprotsenko9855 2 роки тому +11

    I believe that having a single underscore and then a capital letter is prohibited by the standard, otherwise it's implementation dependent. Microsoft reserves double underscores, but also utilizes the _A pattern (std::array for instance has its only member called _M_elems afaik, which allows for some magic)

    • @crazycdn8327
      @crazycdn8327 2 роки тому +1

      Yes, the C++ standard actually reserves single underscore variables for itself, while MS reserves the double. I don't think it matters if it's capitalized after that or not. But I've not read the standard that closely in over a decade haha.

    • @andreyprotsenko9855
      @andreyprotsenko9855 2 роки тому

      @@crazycdn8327 yep, I agree, though I've seen something like that in C (probably when reading K&R, or cppreference)

    • @monochromeart7311
      @monochromeart7311 2 роки тому +3

      @@crazycdn8327 the C/C++ standard reserves multiple things, including functions which start with either "str" or "mem".
      The important ones are identifiers starting with underscore and then a capital letter (like _Generic, or _Atomic), while double-underscores at the start are reserved for standard library implementations.
      Clang and GCC use "__builtin_" at the start of every built-in keyword used to implement a language feature (e.g "offsetof()" is implemented as "#define offsetof(t, d) __builtin_offsetof(t, d)"), but MSVC uses just a double underscore.

  • @johnlim2277
    @johnlim2277 2 роки тому +24

    If not mistaken for the headers to show up in vs projects as source when using cmake, the header files need to be added to the target as a "source"; I.e. add_library(target header.hpp)

    • @Stowy
      @Stowy 2 роки тому +4

      Ah yes I haven't done that and I always use the folder view so I didn't notice this problem, thanks for the solution !

  • @Forjugadname
    @Forjugadname 2 роки тому +1

    This is really great I didn't think about actually running the code in debug mode and watching it line by line.

  • @enigma7791
    @enigma7791 2 роки тому +5

    "Understanding code you didn't write!" My biggest gripe when dumped with a project someone else abandoned. And then you go on a call and seniors suddenly think you know how it all works. Grrrrrrrrr

  • @fredygutierrez174
    @fredygutierrez174 2 роки тому +1

    This is the exact reason I came upon your youtube channel. Trying to figure out my co-worker's 20 years old C++ code.

  • @nullplan01
    @nullplan01 5 місяців тому +1

    The rules for the underscores are not different per compiler. They are indeed standardized, and they are the same for C and C++, for header file compatibility. In C11, this is all defined in §7.1.3. And it reads: "All identifiers that begin with an underscore and either an uppercase letter or another underscore are always reserved for any use. All identifiers that begin with an underscore are always reserved for use as identifiers with file scope in both the ordinary and tag name spaces." In this case, having member variables with one underscore and a *lowercase* letter is OK, because those identifiers are not on file scope. Change it to uppercase and you fall into the first category, where it is always reserved.
    The reason it is always reserved is because the implementation may end up having to define internal macros to do its job, and if you use the same name, you are going to have a bad time.

  • @AntonioNoack
    @AntonioNoack 2 роки тому +1

    The tricks of stepping through the debugger was really helpful :)
    It lets me understand more why some people defend it over just printing things to the console :).

    • @ped7g
      @ped7g 2 роки тому +1

      Debugging by printing is more difficult, and should be last resort when you don't have at least mediocre debugger, or you already exhausted debugger to the limits and the bug was not located.
      The reason why printing is more difficult is, that debugger actions are mostly transparent to the debugged code, while printing to console is being run as part of the debugged code, thus it may affect current state lot more easily than a debugger. You can by accident modify some variable by doing stuff like `items++` in the print statement, or you can modify timings of critical sections enough to make the code magically work when having logging enabled, but getting some crash due to multihreaded race condition when the code is running at top speed without logging. Etc.
      Using debugger can still slightly affect the state of the code (especially timing-critical bugs like race conditions between different threads), but at least you can't accidentally modify some variable while you were trying just to print it to console.
      In the end, one should be able to do both, as sometimes logging is more helpful, but default choice should be debugger, always (or unit tests and avoiding any debugging completely :P ).

  • @paligamy93
    @paligamy93 2 роки тому +2

    @2:38 Header files are compiled. They may be compiled multiple times and the reason why your linker doesn't freak out and start going all one definition rule on you is because they are exactly the same information.
    @5:00 Stepping is the way to go. In OOP languages you can get burned ctrl+click'ing through projects because the IDE may not be smart enough to find what functions are being overridden especially when dependency inversion with interfaces is involved. Super annoying but part of the experience. Also note that in C++ when looking through a desktop application, main can also take a 3rd argument that shows the environment variables.
    "A very common implementation-defined form of main() has a third argument (in addition to argc and argv), of type char**, pointing at an array of pointers to the execution environment variables.'

  • @GodofWar1515
    @GodofWar1515 2 роки тому +1

    I like to read code with a modular approach where I isolate the different modules and try to figure out what they do on their own. It's a lot easier than trying to trace the execution. That's just my opinion though, definitely use a debugger!

  • @rompa6972
    @rompa6972 2 роки тому +5

    Being pedantic, force = gravityForce * mass looks wrong unless gravityForce is really acceleration due to gravity thus satisfying the basic kinematic equation F = ma

    • @Stowy
      @Stowy 2 роки тому +1

      well gravityForce is a variable that dynamic bodies have that's applied if "usesGravity" (or something like that) is true. So basically it's 9.81. Should this be called gravityAcceleration to be more exact ?

    • @rompa6972
      @rompa6972 2 роки тому +1

      @@Stowy absolutely, this an acceleration not a force.

  • @crystalferrai
    @crystalferrai Рік тому

    19:20 It is usually a good idea to add a virtual destructor to any class that is intended to be a base class. Otherwise you may end up in some bad situations where destructors and not called properly. As a side effect, this will allow dynamic_cast to function (assuming RTTI is enabled) because there is now a vtable. As a side note, RTTI adds overhead that is generally not desirable in game engine code, so it is often disabled and dynamic_cast will not function anyway.

  • @TheAxeForgetsTheTreeRemembers
    @TheAxeForgetsTheTreeRemembers 2 роки тому +1

    Part 3 is very much awaited!
    I've been watching these 2 episodes thinking "Man this is all so interesting, but the poor lad hasn't got their code reviewed yet 😅".

  • @StevenMartinGuitar
    @StevenMartinGuitar 2 роки тому

    Lots more to talk about. May as well hang on to this for as long as you can keep pulling out interesting topics you otherwise may not have covered! Top work

  • @cineblazer
    @cineblazer 2 роки тому

    I would really like to see you actually implement these changes in a future video! I think it would be very instructive. Thanks for the insights you've already provided.

  • @davidjohansson8476
    @davidjohansson8476 2 роки тому

    As answer for the question at the end: I do enjoy just watching you talk about code :)

  • @erenenadream
    @erenenadream 2 роки тому +1

    LOVE YOU! THANK YOU FOR ALL YOUR VIDEOS!!!!! Greatings from Turkey.

  • @alexrossouw7702
    @alexrossouw7702 2 роки тому

    You've just answered some questions I've recently had

  • @rmt3589
    @rmt3589 Рік тому +1

    4:29 How can I get those tools in Visual Studio Code?

  • @TheKodeToad
    @TheKodeToad 2 роки тому

    Interesting new zoom effects. I can almost hear "Whoosh!" whenever they play.

  • @joymakerRC
    @joymakerRC Рік тому

    you are the coolest programmer ever. and i like the way you talk , thanks for teaching me so much

  • @skilz8098
    @skilz8098 2 роки тому

    Towards the end with the naming convention of variables, I've never had any issues with using a single leading underscore as long as it is a member of a class or a struct. As for globals variables or even standalone variables within a namespace I avoid using them.

    • @piechulla1966
      @piechulla1966 2 роки тому +1

      _Technically _this _is _not _a _problem. _It _is _just _misleading _in _plain _English _and _very _disturbing _in _code ;-)

  • @notanacorn703
    @notanacorn703 2 роки тому +2

    yay new code review vid

  • @nicolasrausch868
    @nicolasrausch868 2 роки тому

    thank you for this great content, every video inspires me to rethink my projects and work on good habits while coding :). Is there a vidoe where you talk a bit about your history and how you got to the point you are at now? Would really be interested in that!

  • @_getrichnow
    @_getrichnow 2 роки тому

    Your videos are amazing and i'll glad if you make a video on ''How to make window in C++"
    Just waiting for this topic

    • @TheAlison1456
      @TheAlison1456 Рік тому

      you won't need to wait if you type in the search bar

  • @awwastor
    @awwastor Рік тому

    I mostly agree with your definition of struct, but more exactly, in my view a struct doesn’t encapsulate anything, so it doesn’t hide or protect any of its members, simply group them. It can have methods, but those methods need to work with all possible values assigned to the fields of the struct (maybe excluding null pointers) and they have to be just like functions, so basically be rewritable into something like void function(T x) {} instead of a method on T. And no inheritance (because I think that’s still theoretically possible?)

  • @aloluk
    @aloluk 2 роки тому

    Moving the program counter can also corrupt your stack if you move it in/out of the stack, like out of a loop etc.

  • @Andrumen01
    @Andrumen01 2 роки тому +5

    Hi Cherno, if you read this, it would be extremely useful and appreciated if you could show "IDE agnostic" debuggers for C++, specially in Linux. Visual Studio is no always available so getting good debuggers is tricky.
    Thanks!

    • @SigSeg-V
      @SigSeg-V 2 роки тому +2

      CLion has the best debugging experience on Linux IMO

    • @Andrumen01
      @Andrumen01 2 роки тому

      @@SigSeg-V Well, not paid 😅...thanks though!

    • @Spero_Hawk
      @Spero_Hawk 2 роки тому

      I don't use linux but the two I hear about most often are GNU debugger and LLDB. VS Code is also available on Linux but it's more of a code editor.

    • @Andrumen01
      @Andrumen01 2 роки тому +1

      @@Spero_Hawk I hate GNU Debugger, will give LLDB a try. VS Code has an extension for debugging, but it's really not that great. Thanks though!

  • @rand0mtv660
    @rand0mtv660 2 роки тому +2

    16:20 totally agree. If you leave a comment in code, it should tell "why" is something implemented, not "how" it works because the implementation should be readable from code as much as possible. Also thank you for mentioning the nonsense that are short variable names which don't explain their meaning. It just doesn't make sense to shorten variable names to single letter variables, there is really no benefit to it. Yeah congratulations you just saved yourself from typing few characters, but reading that code later nobody will be grateful for that.

  • @ExpensivePizza
    @ExpensivePizza 2 роки тому

    Very interesting about the difference between class and struct in C++. I haven't written much C++ in quite a few years but I know that some other languages like C# have a lot more differences between class and struct which might be where the confusion comes from. It's also quite common in C# to use the _privateMember naming convention.

    • @Stowy
      @Stowy 2 роки тому

      @@jeffmccloud905 well in c++ the only difference is the public by default in structs, the differences in c# are way more fundamentals. The fact that structs are allocated on the stack and other syntactics differences make them very different than classes compared to c++

    • @Stowy
      @Stowy 2 роки тому +1

      ​@@jeffmccloud905 bruh allocation on the stack and the heap is done trough the new keyword or smart pointers in cpp. For ex the first line is on the stack and the second one is on the heap:
      Vector2 v = Vector2(1, 1) // Stack
      Vector2* v = new Vector2(1, 1) // Heap
      And this is the same whether vector2 is a struct or a class. Structs in cpp can be seen as just there for retro-compatibility with C.

    • @Stowy
      @Stowy 2 роки тому +1

      @@jeffmccloud905 yeah it's true that in usage it's pretty rare since it's usually used to represent data, and usually pretty small amounts of it, and it's actually quite confusing with the other similar languages, that's an easy mistake to make so no worries haha

    • @ExpensivePizza
      @ExpensivePizza 2 роки тому

      @@jeffmccloud905 The "garbage collector" is the big difference. It's actually somewhat a myth to say that structs are always allocated on the stack in C#. That's not always the case and it would be more correct to say that value types are stored on the stack in the Microsoft implementation of the desktop CLR under certain circumstances. There's actually plenty of reasons why your struct might end up on the heap in C#.
      But more importantly, the only time when any of this matters is when you're trying to prevent the garbage collector from kicking in the middle of the game loop and cause framerate hiccups. Since you don't have a lot of control over when the garbage collector kicks in directly, what you end up spending time on is preventing unwanted "garbage" from being created in the first place. In other words, you care about how memory is being allocated so that it won't be deallocated when you don't want it to be.

  • @mobslicer1529
    @mobslicer1529 2 роки тому

    can't wait for when my modified windows kernel actually builds and i can do this stuff to understand windows

  • @MetalBladeGamer
    @MetalBladeGamer 2 роки тому +1

    This would have been so hopeful a week ago XD

  • @soheibmemes2594
    @soheibmemes2594 2 роки тому +2

    cherno is the best

  • @dango.aurelius
    @dango.aurelius 2 роки тому

    Header files are separated because this project is a library. Includes folder just get copied at "installation" step

  • @frostyhugo5542
    @frostyhugo5542 2 роки тому

    Tim's santa hat in the background is the best

  • @ultimatesoup
    @ultimatesoup Рік тому

    Been writing game engines professuonally for almost 30 years...have myy own as a side project. Would be interesting to hear your thoughts but it's way large (multiple 100k written by me) and I am doing everything including deleting or implementing copy and move constructiors.
    Currently working on an OS level GUI abstractions layer to assist with writing tooling. Lol I wrote a layer over the old win32 C api in c++, but I also wrote a qt implentation

  • @nhanNguyen-wo8fy
    @nhanNguyen-wo8fy 7 днів тому

    11:35 step into the physic

  • @kowalski2031
    @kowalski2031 2 роки тому +1

    Do you have good techniques to understand bash code ? Bash code can't be debugged like C++.

  • @otmanm4095
    @otmanm4095 2 роки тому

    Thanks

  • @kuroakevizago
    @kuroakevizago 2 роки тому

    If I may know, what extensions do you use Cherno for your visual studio?

  • @swhaebsalam6680
    @swhaebsalam6680 2 роки тому

    Very true

  • @jokerkof7131
    @jokerkof7131 2 роки тому

    what is the font and color theme in his viusal studio? I would be very grateful if someone tell me.

  • @pythonicentertainment6280
    @pythonicentertainment6280 2 роки тому

    Hey @TheCherno I'm running through your game engine series as of rn and want to make it like hazel but with the physics of like snowdrop from before they downgraded it any advice ^^
    really enjoying the series

  • @abirneji
    @abirneji Рік тому

    personally I just make structs simple and classes complex, but if structs to everything classes do and they're also backwards compatible with C
    doesn't that just make them the superior tool?
    why was class made if it's the same thing?

  • @oscareriksson9414
    @oscareriksson9414 2 роки тому

    Hahahaha I'll immediatly goto the last video because I want to hear about the memory

  • @anon_y_mousse
    @anon_y_mousse 2 роки тому

    I agree that code should mostly be self documenting, but when it comes to math you really need comments no matter what names you give your variables. Pretty sure it's in the standard that identifiers with leading underscores are reserved. Kind of agree about struct versus class, but I think "rigid body" should be a POD. Of course, if you want truly self documenting code you should never use auto.

  • @arsenbabaev1022
    @arsenbabaev1022 2 роки тому

    true

  • @Lightbringer7734
    @Lightbringer7734 2 роки тому +2

    Demo BALLS and cubes, why not Demo spheres and cubes 🤔

    • @TheAlison1456
      @TheAlison1456 Рік тому +1

      funny thing is, they're circles and squares

  • @unmeinks5907
    @unmeinks5907 2 роки тому

    ily (:

  • @zelda_smile
    @zelda_smile Рік тому

    "Hedaphile" - The Cherno

  • @yuwownly8630
    @yuwownly8630 2 роки тому +1

    3rd

  • @aaron6807
    @aaron6807 2 роки тому +1

    16:45 lmao try saying that to linux developers

    • @TheAlison1456
      @TheAlison1456 Рік тому

      don't worry, my friend! they're just saving memory by using less letters!

  • @tolkienfan1972
    @tolkienfan1972 2 роки тому

    Next up: how to write code that's readable to other people :-)

  • @logannance10
    @logannance10 2 роки тому

    Suprised this isn't sponsored by Visual Studio.

  • @kuyajj68
    @kuyajj68 2 роки тому +1

    1st!

  • @judedavis92
    @judedavis92 2 роки тому

    679th!

  • @skellymon1771
    @skellymon1771 2 роки тому

    you look like MrBeast's long lost brother

  • @sheeftz
    @sheeftz 2 роки тому

    15:52 A С++ code review guy honesly hates one of the most demanded feature in c++20...
    At this exact place personally I would say:
    - you should add an additional std::views::filter to loop only through dynamic bodies, instead of that first line check inside of the loop body.
    - add 'using name std;' to drop all these redundant std:: qualifiers.
    - don't use 'auto' keyword when declaring a subject of a loop. As a reader of the code, I dont know the type of the values of _bodies. You hid it from me with the 'auto' keyword for no apparent reason.

    • @Stowy
      @Stowy 2 роки тому

      I didn't know about the std::views::filter, most of that c++20 stuff is from resharper hints tbh, i'll see how that works 🤔
      for using namespace std, there's a cherno video where he explains why it's not the best, especially in header files. I personnaly got used to it
      I see why you would say that, i like the word auto in general, and in the context of this project i think it's not too bad, but i can definetly see how it can get confusing on a bigger scale
      thanks for also giving feedback :D

    • @sheeftz
      @sheeftz 2 роки тому

      @@Stowy The new ranges library has plenty of useful stuff. And don't take everything what Cherno says as a c++ world rule. He's stuck in the past. He can't accept even the simplest new little things like range views. Looking at how he reacts on views::values, I can only try to imagine his reaction on asynchronous code design with c++20 coroutines. It will blow his mind completely out of his head.

    • @Stowy
      @Stowy 2 роки тому

      @@sheeftz well i do think the syntax for ranges is kinda weird, although it's super usefull, i can see how when you're not used to it, it can look very wrong

    • @Stowy
      @Stowy 2 роки тому

      @@sheeftz oh thanks, i'll check it out !

    • @user-dh8oi2mk4f
      @user-dh8oi2mk4f 2 роки тому

      @@sheeftz why did you recommend using namespace std?

  • @akiyprum
    @akiyprum 2 роки тому

    It's true that I also suddenly talk about memory when I have conversations with friends.

  • @ciriacovaliente1221
    @ciriacovaliente1221 2 роки тому

    man I missed this kind of tutorials lol. Great work here, thanks!!!

  • @fiorellalirusso7440
    @fiorellalirusso7440 2 роки тому

    thank you so much , it worked 