HOME->講習会->プログラミングセミナー->C++セミナー(初級)
変数にデータを取り込むことができたら,実際に計算をさせてみましょう.
目次
・算術演算子と論理演算子
・演算優先度
・キャスト
・標準数学関数
・演習
演算子
一般的な四則演算をするための算術演算子と2進数の論理演算を計算するための論理演算子(ビット演算子),大小関係など比較するための比較演算子があります.
演算子 | 動作 |
A+B | \(A+B\) |
A-B | \(A-B\) |
A*B | \(A \times B\) |
A/B | \(A \div B\) |
A%B | \(A \mod B\) |
A=B | \(A=B\) |
A+=B | \(A=A+B\) |
A-=B | \(A=A-B\) |
A*=B | \(A=A\times B\) |
A/=B | \(A=A\div B\) |
A%=B | \(A=A\mod B\) |
A|B | \(A\cup B\)(すべてのビットに対して) |
A&B | \(A\cap B\)(すべてのビットに対して) |
A^B | \(A\oplus B\)(すべてのビットに対して) |
~A | \(\bar{A}\)(すべてのビットに対して) |
A||B | \(A\cup B\) |
A&&B | \(A\cap B\) |
A<<B | AをBだけ左シフト演算 |
A>>B | AをBだけ右シフト演算 |
A|=B | \(A=A\cup B\) |
A&=B | \(A=A\cap B\) |
A^=B | \(A=A\oplus B\) |
A<<=B | AをBだけ左シフト演算してAに代入 |
A>>=B | AをBだけ右シフト演算してAに代入 |
A++ | 後置増分(Aに1bit加算) |
A – – | 後置減分(Aに1bit減算) |
++A | 前置増分(Aに1bit加算) |
– – A | 前置減分(Aに1bit減算) |
A==B | AとBが一致のときtrue(1), そうでないときfalse(0) |
A!=B | AとBが不一致のときtrue(1), そうでないときfalse(0) |
A<B | AがB未満のときtrue(1), そうでないときfalse(0) |
A<=B | AがBが以下のときtrue(1), そうでないときfalse(0) |
A>B | AがB超過のときtrue(1), そうでないときfalse(0) |
A>=B | AがB以上のときtrue(1), そうでないときfalse(0) |
演算子優先度
一般的な数式のように演算子によって計算順序に決まっています.また,C++においては,計算順序が左から右に流れるだけではなく,右から左に流れるものがあります.以下に,演算子の優先順位を示します.一部,紹介していないものが含まれますが,今後扱うことになるので記載しておきます.
優先度 | 演算子 | 動作 | 結合の向き |
1 | () [] -> . ++ – – | 関数呼び出し 配列の要素 ポインタからの構造体メンバアクセス 構造体メンバアクセス 後置増分 後置減分 | 左から右 |
2 | ! ~ ++ – * & | 論理否定 ビット論理否定 前置増分 前置減分 ポインタ間接参照 メモリアドレス参照 | 右から左 |
3 | (型名) | キャスト | 右から左 |
4 | * / % | 乗算 除算 剰余 | 左から右 |
5 | + – | 加算 減算 | 左から右 |
6 | << >> | 左シフト演算 右シフト演算 | 左から右 |
7 | < <= > >= | 左が右未満 左が右以下 左が右超過 左が右以上 | 左から右 |
8 | == != | 等しい 等しくない | 左から右 |
9 | & | ビット論理積 | 左から右 |
10 | ^ | ビット排他的論理和 | 左から右 |
11 | | | ビット論理和 | 左から右 |
12 | && | 論理積 | 左から右 |
13 | || | 論理和 | 左から右 |
14 | = += -= *= /= %= <<= >>= &= |= ^= | 代入 加算代入 減算代入 乗算代入 除算代入 剰余代入 左シフト代入 右シフト代入 ビット論理積代入 ビット論理和代入 ビット排他的論理和代入 | 右から左 |
キャスト
異なる変数型で計算をするときは,キャストと呼ばれるものを使用することが必要である.例えば,整数型と浮動小数点数型の変数で除算を行った際に,小数部が切り捨てられて計算される場合があります.このような時はキャストを使用します.
#include <iostream>
int main()
{
int i=5;
double pi=3.14;
double ans=(double)i/pi;
std::cout << ans << std::endl;
}
上記のように,変数の型を一時的に変換した変数の前に「(変数型)」というように記述することで,int型変数iを一時的にdouble型変数に置き換えることができます.
標準数学関数
演算子とは異なりますが,基本的な数学関数(三角関数や指数関数など)は,標準ライブラリとして用意されています.使用する際には,「cmath」をincludeします.一例を以下に示します.「C++ 対数関数」というように調べると基本的な数学関数の情報はあります.
関数 | 動作 |
std::sin(x) | \(\sin(x)\) |
std::cos(x) | \(\cos(x)\) |
std::tan(x) | \(\tan(x)\) |
std::asin(x) | \(\sin^{-1}(x)\) |
std::acos(x) | \(\cos^{-1}(x)\) |
std::atan(x) | \(\tan^{-1}(x)\) |
std::atan2(y,x) | \(x\)と\(y\)がなす角を\(-\pi\leq\theta\leq\pi\)で出力 |
std::pow(x,a) | \(x^a\) |
std::log(x) | \(\log(x)\) |
std::log10(x) | \(\log_{10}(x)\) |
std::sqrt(x) | \(\sqrt{x}\) |
例えば,入力された2つの値\(x,y\)から,角度\(\theta [\degree]\)を表示するには以下のようになります.
#include <iostream>
#include <cmath>
int main()
{
double x,y;
std::cin >> x >> y;
std::cout << std::atan2(y,x)*180/M_PI << std::endl;
}
cmathに実装されている三角関数はラジアンで扱うので注意が必要です.また,cmathには円周率が定義されており,「M_PI」が円周率となります.
演習
1.2つの入力された値\(x,y\)において,\(\sqrt{x^2+y^2}\)を出力せよ.ただし,計算式は1行で記述し,標準数学関数ライブラリは用いてもよい.
2.3つの入力された値\(a,b,c\)において,\(\frac{-b+\sqrt{b^2-4ac}}{2a}\)を出力せよ.ただし,計算式は1行で記述し,標準数学関数ライブラリは用いてもよい.