# 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的話就會破壞這個優化