# Hello world!

#include <iostream>
using namespace std;
int main()
{
    cout << "Hello world!" << endl;
    return 0;
}

大家一定都看過以上程式,通常這也是編譯器 (compiler) 預設的程式
接下來,就要看看它是怎麼運作的

# cin 與 cout

首先,我們需要 include 標頭檔 iostream #include <iostream>
原因是 cin 及 cout 並非 C++ 本身定義的函式 (function),如果要用到 cin 或 cout 就需要 include iostream

接下來,我們要寫 using namespace std; 這一行
它的意思是我們使用 iostream,也就是 C++ 函式庫中的函式
如果沒有加這一行,那之後用到 cin、cout 或其他函式的時候,都需要在前面加 std::
例如: std::cin >> a; std::cout << a;

int main()
{
    return 0;
}

這邊照寫就好,是程式的框架,程式會從 main 函式開始執行

記得每行程式的結尾都要加上 ; 結尾符號


cin 的標準格式為: std::cin >> 變數a >> 變數b; 以空格隔開不同輸入
cout 的標準格式為: std::cout << 變數或敘述a << 變數或敘述b;

變數可為不同的資料型態,例如:

int a;  // 整數
double b;  // 小數
string c; // 字串
cin >> a >> b >> c; // 輸入 0 2.5 xyz
cout << "a:" << a << "  b:" << b << "  c:" << c;

輸出為: a:0 b:2.5 c:xyz
"" 雙引號內可打任何的文字,會直接印出
(關於各種資料型態,會在下一篇詳細介紹)


為什麼上面 cout 要寫 變數或敘述a 呢?那是因為 cout 裡面也可以放運算式

int a = 1;
int b = 2;
cout << a + b << " " << a - b << " " << a * b << " " a / b; // 分別為加減乘除

輸出為: 3 -1 2 0 (整數除法為無條件捨去)


另外,cout 及 cin 也可以寫成多行格式,例如:

int a, b;
cin >> a
    >> b;
cout << a
    << b;

一般可能看起來很奇怪,但是在需要大量輸入輸出時,可以讓程式碼更加易懂


cout 中的換行有兩種寫法

  1. cout << "\n";cout << '\n';
  2. cout << endl;
    兩種寫法達成的效果是一樣的
    如果要換多行,則增加 \nendl 的數量即可

例如:換三行

  1. cout << "\n\n\n";
  2. cout << endl << endl << endl;

# scanf 與 printf

scanf 與 printf 則需要 include 標頭檔 stdio.h #include <stdio.h>


scanf 的標準格式為: scanf("變數型態", &變數a);
printf 的標準格式為: printf("變數型態", 變數或敘述a);

scanf 與 printf 的變數型態必須正確,不然可能會造成錯誤輸出

int a = 0;
float b = 2.5;
char c = 'y';
printf("%d %f %c\n", a, b, c);
scanf("%d %f %c", &a, &b, &c); // 輸入 5 23.56 p
printf("%d %f %c", a, b, c);

輸出為:
0 2.5 y
5 23.56 p
可以發現輸入到變數 a b c 的值會直接覆蓋原本的值

使用 scanf 的時候,變數前須加上 & 符號

%d 為整數
%f 為浮點數 (小數)
%c 為字元
(同樣會在下一章中詳細介紹)


printf 同樣也能放運算式

int a = 3;
int b = 4;
printf("%d %d %d %d", a + b, a - b, a * b, a / b);

輸出為: 7 -1 12 0


另外,printf 中換行只能使用 \n
相較於 cin 與 cout,scanf 與 printf 的執行速度比較快


# cin cout 速度優化

前面提到,一般情況下 cin 及 cout 的速度會比 scanf 及 printf 慢
原因是 cin 及 cout 會與 stdio 中的 input 及 output 同步,而且 cin 及 cout 都會先進到緩衝區
以下的程式能取消與 stdio 的同步,並強迫清空緩衝區

ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);

輸入以上程式後,換行就只能用 \n ,使用 endl 的話就會破壞這個優化