C++セミナー(初級)演算子

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<<BAをBだけ左シフト演算
A>>BAをBだけ右シフト演算
A|=B\(A=A\cup B\)
A&=B\(A=A\cap B\)
A^=B\(A=A\oplus B\)
A<<=BAをBだけ左シフト演算してAに代入
A>>=BAをBだけ右シフト演算してAに代入
A++後置増分(Aに1bit加算)
A – – 後置減分(Aに1bit減算)
++A前置増分(Aに1bit加算)
– – A前置減分(Aに1bit減算)
A==BAとBが一致のときtrue(1),
そうでないときfalse(0)
A!=BAとBが不一致のときtrue(1),
そうでないときfalse(0)
A<BAがB未満のときtrue(1),
そうでないときfalse(0)
A<=BAがBが以下のときtrue(1),
そうでないときfalse(0)
A>BAがB超過のときtrue(1),
そうでないときfalse(0)
A>=BAが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行で記述し,標準数学関数ライブラリは用いてもよい.