C++サンプル集

【第1部】C言語(K&R検証)編

0018.足し算を実装する(符号対応版)

ソース紹介

 ここでは0010.足し算を実装するのサンプルを + -  符号に対応させたものです。
CPPファイルに記述
#include <iostream>
#include <cstdio>
#include <cctype>
#include <string>
using namespace std;

/*
sを整数に変換する(+,-対応版)
*/
int atoi(char s[]) {
    int i, n, sign;
    for (i = 0; isspace(s[i]); i++) {
        ;   //空白を飛ばす
    }
    sign = (s[i] == '-') ? -1 : 1;
    if (s[i] == '-' || s[i] == '+') {
        i++;    //符号を飛ばす
    }
    for (n = 0; isdigit(s[i]); i++) {
        n = 10 * n + (s[i] - '0');
    }
    return sign * n;
}

/*
足し算の実装
*/
int main()
{
    string leftstr;
    string rightstr;
    getline(cin, leftstr);
    getline(cin, rightstr);
    cout << atoi(leftstr.c_str()) + atoi(rightstr.c_str()) << endl;
    return 0;
}
出力
12346
-568421
-556075
-58642
+457824
399182
+123456
-123456
0

サンプル説明

 出力例を見てもらえればわかるように、今回のバージョンではatoi()関数が符号に対応しています。
 しかしながら0010.足し算を実装するでは、すでにcinからstringに入れる手法で符号対応もできています。
 なのでこのサンプルの見どころはatoi()関数内の
    sign = (s[i] == '-') ? -1 : 1;
 の部分でしょうか。sign-1もしくは1を入れてます。このことは、リターン時に
    return sign * n;
 という形で記述されています。

K&Rでの記述

 元になったのは第3章:制御の流れに記述されています。ループの説明のところです。