CISC/CMPE320 • Reminders: • Course Web Site: http://research.cs.queensu.ca/home/cisc320 • Have you filled out the questionnaire in Moodle? (39 left – as of last night). • Are you able to run a C++ console program in your IDE of choice? • Today: – “Hello World” Ritual – Some history of C++ Fall 2015 CISC/CMPE320 - Prof. McLeod 1 Demo - “Hello World” in C++ • For simple console demos I’m going to use the Eclipse CDT. • A few notes: – Make sure your project has the proper “Includes” links. – You should provide the extension “.cpp” for a source code file, or “.h” for a header, or declaration file. – Suggest that you turn off automatic building. (Off by default…) – But, don’t forget to save, then build before you run. Fall 2015 CISC/CMPE320 - Prof. McLeod 2 Some Explanation • #include is a preprocessor directive that is used to include external code into your program. • iostream is a library of I/O streams (makes sense!). • A namespace is a collection of name definitions. (The same name can be used in separate namespaces). using namespace std; says that your program is using names from the std (or “standard”) namespace. • Another way to do this is to use the :: “scope resolution operator”, as in std::cout (but this gets to be a pain of youCISC/CMPE320 are using a lot of names…) Fall 2015 - Prof. McLeod 3 Some Explanation, Cont. • int main() is a function header. • Code within the function is contained between { } • cout is an object from the iostream library that represents the console output stream. • << is the “insertion operator” and is used to insert the supplied string literal into the cout object. • endl stands in for a line feed character. • In ISO C++ the return 0; is supposed to be optional, but some older compilers still require it. Fall 2015 CISC/CMPE320 - Prof. McLeod 4 Some More Explanation… • Note that older style C libraries still use the “.h” extension, as in stdio.h. • The newer library uses cstdio instead. • Sometimes you just don’t know, so you have to experiment. For example, from the STL, you could try: – Vector – vector.h – vector • One of them should work! • I will always try to use the latest library names. Fall 2015 CISC/CMPE320 - Prof. McLeod 5 Aside:How to Run C++11 Code in Eclipse • Assuming the MinGW (or GCC) compiler. • To change for just a project: • C/C++ Build -> Settings -> Tool Settings -> GCC C++ Compiler -> Miscellaneous -> Other Flags. Put “-std=c++11” at the end (after a space). • Click on “Apply” after the change. Fall 2015 CISC/CMPE320 - Prof. McLeod 6 History of C++ In the beginning there was C… Not really, but let’s not go back too far… Fall 2015 CISC/CMPE320 - Prof. McLeod 7 History of C++ - BCPL • 1966 is before you were born, so let’s start there: • BCPL or “Basic Computer Programming Language” designed by Martin Richards of the University of Cambridge. • Used to write compilers. • It was the first language that created “O-code” before executable code: Fall 2015 CISC/CMPE320 - Prof. McLeod 8 Aside – “O-Code” BCPL Java Source Code Source Code Compiler O-Code Virtual Machine Compiler Generic Hardware Dependent Byte Code JVM Machine Code Machine Code CPU CPU Fall 2015 CISC/CMPE320 - Prof. McLeod 9 “O-Code”, Cont. • Before BCPL, when they wanted to run on a new platform, the entire compiler program had to be re-written (took 5 man-months…). • Now only the part (about 1/5 of the total code) that generated the machine code – the “Virtual Machine” had to be changed, the part that generated the generic O-Code did not have to change. • Radical Idea! • (Also the first language to use { } and // for comments.) Fall 2015 CISC/CMPE320 - Prof. McLeod 10 B • Written at Bell Labs by Ken Thompson with contributions by Dennis Ritchie. First appeared in 1969. • Stripped down version of BCPL to run on “minicomputers” like the DEC PDP-11. • Had a single data type, the “word” that was an integer most of the time, but could also be a memory reference. • Gradually evolved into C in the early 70’s. Fall 2015 CISC/CMPE320 - Prof. McLeod 11 • Ken Thompson (seated) and Dennis Ritchie working on a DEC PDP11 in 1970: • They also invented the UNIX OS. • (The PDP11 was a 16 bit machine.) Fall 2015 CISC/CMPE320 - Prof. McLeod 12 C • Dennis Ritchie, of Bell Labs, is given credit for C in 1972. • A procedural language used for systems programming (compilers for example) and for embedded systems. • Gives low level access to memory and efficient translation to machine code. • No longer have to code in Assembly language! • Used on any kind of computer during the late 70’s and early 80’s including the IBM-PC. • In 1983 the language was standardized by ANSI, giving birth to “ANSI C”, also called “C89”. Fall 2015 CISC/CMPE320 - Prof. McLeod 13 C With Classes • Was developed by Bjarne Stroustrup at Bell Labs starting in 1979, as an enhancement to C. • Added to C: – – – – – – classes virtual functions operator overloading multiple inheritance templates exception handling, etc. • In 1983 the name of the language was changed to C++ (the increment operator…). Fall 2015 CISC/CMPE320 - Prof. McLeod 14 C++ Standards • It took a long time, but the language was first standardized in 1998 by ISO. • The standard was updated in 2003 and amended in 2005 (310 pages, without the library!). • Another standard was completed in 2011: “C++11” (August 12, 2011, 1338 pages!). • C++14 came out on August 18, 2014. A smaller set of changes from C++11. • Work is underway on C++17. Fall 2015 CISC/CMPE320 - Prof. McLeod 15 C++ Standards, Cont. • But: • It takes a while (and a considerable amount of work) to update compilers to the new standards. • See: http://en.cppreference.com/w/cpp/compiler_support for a summary of how various compilers are doing. • GCC version 4.8.1 is now up-to-date with C++11. • Visual Studio is almost as good and Clang is also up-to-date with C++11. Fall 2015 CISC/CMPE320 - Prof. McLeod 16 C++ Standards, Cont. • Compilation is *not* standardized, just the syntax. • How does Java compare, for example? Fall 2015 CISC/CMPE320 - Prof. McLeod 17 The “Philosophy” of C++ • From “The Design and Evolution of C++” by (who else!) Bjarne Stroustrup, 1994: • C++ is designed to be a statically typed, generalpurpose language that is as efficient and portable as C. • C++ is designed to directly and comprehensively support multiple programming styles (procedural programming, data abstraction, object-oriented programming, and generic programming). • C++ is designed to give the programmer choice, even if this makes it possible for the programmer to choose incorrectly. Fall 2015 CISC/CMPE320 - Prof. McLeod 18 The “Philosophy” of C++, Cont. • C++ is designed to be as compatible with C as possible, therefore providing a smooth transition from C. • C++ avoids features that are platform specific or not general purpose. • C++ does not incur overhead for features that are not used (the "zero-overhead principle"). • C++ is designed to function without a sophisticated programming environment. Fall 2015 CISC/CMPE320 - Prof. McLeod 19 ISO C++ and C • The C++ standard library has incorporated the standard C library with just a few optimizations. • C++ also has the “Standard Template Library”, or “STL”, that contains many pre-defined data structures, for example. • Generally, well-written C code will run in C++. • But some C “things” will not work in C++ (for example, in C you can use new or class as variable names, since they are not C keywords.) Fall 2015 CISC/CMPE320 - Prof. McLeod 20 Running a C++ Program Source Code, *.cpp, *.h Source Code Editor Compiler Library Code O-Code, *.o Linker Machine Code, *.exe CPU Fall 2015 CISC/CMPE320 - Prof. McLeod 21 Running a C++ Program, Cont. • Thankfully, an IDE simplifies this process for you. • A project (a set of source code and resource files) is “built” – which consists of both compilation and linking. • MinGW (“Minimalist GNU for Windows”), for example uses the g++.exe program for this. The IDE makes up the command line calls to this program. • Building creates a *.o file and then a *.exe file. • Then you run the *.exe program. • Each stage of this process can unearth errors. Fall 2015 CISC/CMPE320 - Prof. McLeod 22 Who Reports the Errors? • An Eclipse pre-compiler does a pretty good job of reporting syntax errors and warnings. Errors may prevent building. You can (but should not!) ignore warnings. • Build errors are reported by the compiler and are seen in the console window. • Run-time errors are reported by the OS, which is running the *.exe file. Fall 2015 CISC/CMPE320 - Prof. McLeod 23 Variable Types • How many variable types do you have in C? (not counting structs)? • You can have the atomic types, pointers and arrays of these types. Anything else? • • • • • How many types can you have in C++? Infinitely many! Thousands defined in the STL. You can define as many as you want. Oh – the atomic types are still there too… Fall 2015 CISC/CMPE320 - Prof. McLeod 24 Variable Declaration • C++ is declarative and statically typed. • ie. “Declare before you use” and “You can’t change the type of a variable, once declared”. • Unlike C, you can declare variables anywhere, as long as you satisfy the above. • Initialization is good practice, but is optional. • Examples: int numStudents(40); // C++ style declare bool flagVal(true); double aNum; Fall 2015 CISC/CMPE320 - Prof. McLeod 25 Variable Declaration, Cont. • This is what we are used to from Java: int numStudents = 40; bool flagVal = true; • For a C++ “style” declaration, use: int numStudents(40); bool flagVal(true); • Looks like you are invoking a constructor doesn’t it? Fall 2015 CISC/CMPE320 - Prof. McLeod 26 Type Categories in C++ • Fundamental types: – bool, char, integer types and floating point types • • • • • • Enumerated types. The void type. Pointer types (like int*) Array types (like int[]) Reference types (like int&) Data structures (like vector) and classes Fall 2015 CISC/CMPE320 - Prof. McLeod 27 bool and char Types • bool literal values: true and false • char literal values: 'H' • Escape characters: – – – – – – – – – – – Fall 2015 \n \t \b \r \a \? \\ \' \" \0## \x## newline tab backspace carriage return BEL ? \ ' " octal hex CISC/CMPE320 - Prof. McLeod 28 Integer Types • Simplify things a bit (forget unsigned…): – – – – short int long long long 2 bytes 4 bytes 4 bytes 8 bytes • To get a long long literal append an l or better yet, an L to the end of the number. • What is “unsigned” anyways? Fall 2015 CISC/CMPE320 - Prof. McLeod 29 Floating Point Types • float • double • long double 4 bytes 8 bytes 12 bytes • Literal floating point numbers have a decimal place and/or an exponent: 4.5, 2.3e-7, for example. • A float literal has an f or F appended to it. • A long double gives you easy access to extended precision numbers. Fall 2015 CISC/CMPE320 - Prof. McLeod 30 TestTypes Demo • Your compiler will determine the amount of memory allocated to the numeric types. • Use the sizeof() function to find out. • Do integers wrap around as they do in Java? • See the demo… • Note that there is some variation on these types depending on the compiler you are using. Fall 2015 CISC/CMPE320 - Prof. McLeod 31 Aside - Divide by Zero Example • How does Eclipse/GCC handle a divide by zero? • Check out TestZeroDivide.cpp. • Note: compilation errors and warnings, run-time errors. Note that the run-time error results from the crashing of the executable, and is reported by the OS, not Eclipse. • How does Java handle a divide by zero? Fall 2015 CISC/CMPE320 - Prof. McLeod 32