Lecture 2: Data Type & Formatted Input/Output (2)

細部拆解一個 C++ 程式碼

Debugger 逐行解釋

#include <iostream>

int main(void)
{
    int a = 0, b = 0, c = 0;
    std::cout << "input a:";
    std::cin >> a;
    std::cout << "input b:";
    std::cin >> b;
    c = a + b;
    std::cout << "a: " << a << std::endl
              << "b: " << b << std::endl
              << "a + b = " << c << std::endl;
    return 0;
}

為何要寫 #include <> ?

Include 了許多已經先寫好的 function,有些是跟系統有關,我們看不到原始碼的,我們只要拿來用就好。 可以打開 /usr/include/c++/9/iostream 看原始碼。

為何 int main(void) ?

main 的定義

  1. int main () { body }
  2. int main (int argc, char *argv[]) { body }

The main function is called at program startup after initialization of the non-local objects with static storage duration. It is the designated entry point to a program that is executed in hosted environment (that is, with an operating system). The entry points to freestanding programs (boot loaders, OS kernels, etc) are implementation-defined.

Another example:

#include <iostream>
#include <sstream>

int main(int argc, char *argv[])
{
    int a = 0, b = 0, c = 0;
    std::stringstream char_array_to_int;
    std::cout << argc << std::endl;
    char_array_to_int << argv[1] << ' ' << argv[2];
    char_array_to_int >> a;
    char_array_to_int >> b;
    c = a + b;
    std::cout << "a: " << a << std::endl
              << "b: " << b << std::endl
              << "a + b = " << c << std::endl;
    return 0;
}

Coding Style & 變數名稱規則

好的 coding style 很重要

Bad example:

#include <iostream>
#include <sstream>
int main(int argc, char *argv[]){int a = 0, b = 0, c = 0;std::stringstream char_array_to_int;std::cout << argc << std::endl;char_array_to_int << argv[1] << ' ' << argv[2];char_array_to_int >> a;char_array_to_int >> b;c = a + b;std::cout << "a: " << a << std::endl << "b: " << b << std::endl << "a + b = " << c << std::endl;return 0;}

intend & spacing

Bad example:

#include <iostream>
#include <sstream>
int main(int argc, char *argv[]){int a = 0, b = 0, c = 0;
  std::stringstream char_array_to_int;
    std::cout<<argc<<std::endl;
    char_array_to_int<<argv[1]<<' '<<argv[2];
char_array_to_int>>a;
    char_array_to_int>>b;
 c=a+b;
    std::cout<<"a: "<<a<<std::endl
              <<    "b: "      << b <<      std::endl
    << "a + b = "<< c << std::endl;
    return 0;
}

fomatter

In vscode:

  • Windows: Shift Alt F
  • macOS: Shift Option F
  • Linux: Ctrl Shift I

Demo

變數名稱規則

GNU

#include <iostream>
#include <sstream>
int main(int argc, char *argv[])
{
  int a = 0, b = 0, c = 0;
  std::stringstream char_array_to_int;
  std::cout << argc << std::endl;
  char_array_to_int << argv[1] << ' ' << argv[2];
  char_array_to_int >> a;
  char_array_to_int >> b;
  c = a + b;
  std::cout << "a: " << a << std::endl
            << "b: " << b << std::endl
            << "a + b = " << c << std::endl;
  return 0;
}

Hungarian notation

#include <iostream>
#include <sstream>
int main(int argc, char *argv[])
{
  int a = 0, b = 0, c = 0;
  std::stringstream charArrayToInt;
  std::cout << argc << std::endl;
  charArrayToInt << argv[1] << ' ' << argv[2];
  charArrayToInt >> a;
  charArrayToInt >> b;
  c = a + b;
  std::cout << "a: " << a << std::endl
            << "b: " << b << std::endl
            << "a + b = " << c << std::endl;
  return 0;
}

變數格式 & 型態轉換

int, long, long long

TypeSize in bitsFormatValue range
int16signed\(-32768\) to \(32767\)
unsigned\(0\) to \(65535\)
long32signed\(-2,147,483,648\) to \(2,147,483,647\)
unsigned\(0\) to \(4,294,967,295\)
long long64signed\(-9,223,372,036,854,775,808\) to \(9,223,372,036,854,775,807\)
unsigned\(0\) to \(18,446,744,073,709,551,615\)

unsigned int & overflow

#include <iostream>
int main(void)
{
  int i = 2147483647;
  unsigned int j = 4294967295U;
  std::cout << i << ' ' << i + 1 << ' ' << i + 2 << std::endl;
  std::cout << j << ' ' << j + 1 << ' ' << j + 2 << std::endl;
  return 0;
}

float, double, double double

TypeSize in bitsFormatValue range
float32IEEE-754min subnormal: \( \pm 1.401,298,4 \times 10^{-45} \)
min normal: \( \pm 1.175,494,3 \times 10^{-38} \)
max: \( \pm 3.402,823,4 \times 10^{38} \)
double64IEEE-754min subnormal: \( \pm 4.940,656,458,412 \times 10^{-324} \)
min normal: \( \pm 2.225,073,858,507,201,4 \times 10^{-308} \)
max: \( \pm 1.797,693,134,862,315,7 \times 10^{308} \)
long doulbe80x86min subnormal: \( \pm 3.645,199,531,882, \)
\( 474,602,528 \times 10^{-4951} \)
min normal: \( \pm 3.362,103,143,112, \)
\( 093,506,263 \times 10^{-4932} \)
max: \( \pm 1.189,731,495,357, \)
\( 231,765,021 \times 10^{4932} \)
__float128128IEEE-754min subnormal: \( \pm 6.475,175,119,438,025, \)
\( 110,924,438,958,227,646,552,5 \times 10^{-4966} \)
min normal: \( \pm 3.362,103,143,112,093, \)
\( 506,262,677,817,321,752,602,6 \times 10^{-4932} \)
max: \( \pm 1.189,731,495,357,231, \)
\( 765,085,759,326,628,007,016,2 \times 10^{4932} \)

floating point precision

#include <iostream>
#include <iomanip>
int main(void)
{
  float x = 1.23456789;
  std::cout << std::setprecision(3) << x << std::endl;
  std::cout << std::setprecision(4) << x << std::endl;
  std::cout << std::fixed;
  std::cout << std::setprecision(5) << x << std::endl;
  std::cout << std::setprecision(9) << x << std::endl;
  return 0;
}

cast

#include <iostream>
int main(void)
{
  double f = 3.14;
  unsigned int n1 = (unsigned int)f; // C-style cast
  std::cout << f << std::endl;
  std::cout << n1 << std::endl;
  return 0;
}

char

TypeSize in bitsFormatValue range
character8signed\( -128 \) to \( 127 \)
unsigned\( 0 \) to \( 255 \)
16UTF-16\( 0 \) to \( 65535 \)
32UTF-32\( 0 \) to \( 1,114,111 \) (0x10ffff)

ASCII

Hex = Hexdecimal Value, Char = Character

HexCharHexCharHexCharHexChar
0NUL (null)20SPACE40@60`
1SOH (start of heading)21!41A61a
2STX (start of text)22" \"42B62b
3ETX (end of text)23#43C63c
4EOT (end of transmission)24$44D64d
5ENQ (enquiry)25%45E65e
6ACK (acknowledge)26&46F66f
7BEL (bell \a)27' \'47G67g
8BS (backspace \b)28(48H68h
9TAB (horizontal tab \t)29)49I69i
ALF (NL line feed, new line \n)2A*4AJ6Aj
BVT (vertical tab \v)2B+4BK6Bk
CFF (NP form feed, new page \f)2C,4CL6Cl
DCR (carriage return \r)2D-4DM6Dm
ESO (shift out)2E.4EN6En
FSI (shift in)2F/4FO6Fo
10DLE (data link escape)30050P70p
11DC1 (device control 1)31151Q71q
12DC2 (device control 2)32252R72r
13DC3 (device control 3)33353S73s
14DC4 (device control 4)34454T74t
15NAK (negative acknowledge)35555U75u
16SYN (synchronous idle)36656V76v
17ETB (end of trans. block)37757W77w
18CAN (cancel)38858X78x
19EM (end of medium)39959Y79y
1ASUB (substitute)3A:5AZ7Az
1BESC (escape \e)3B;5B[7B{
1CFS (file separator)3C<5C\ \\7C|
1DGS (group separator)3D=5D]7D}
1ERS (record separator)3E>5E^7E~
1FUS (unit separator)3F? \?5F_7FDEL
#include <iostream>
int main(void)
{
  char char_five = '5';       // char_five = 53
  char char_diff = '5' - '0'; // char_diff = 53-48 = 5
  char c = 'B' + 32;          // c = 98 = 'b'
  std::cout << char_five << std::endl;
  std::cout << (int)char_five << std::endl;
  std::cout << (int)char_diff << std::endl;
  std::cout << c << std::endl;
  return 0;
}

others

UTF-8, UTF-16, Big5, Shift_JIS, etc.

Reference: