LoginSignup
1
0

More than 3 years have passed since last update.

C(とか)で四則演算の結果すら合わない

Last updated at Posted at 2018-12-02

...という恥ずかしい検索を仕事中にテンパってやってしまった話。

実際にやらかしたミス

コード

before.cpp
#include <iostream>

#define IMAGE_HEIGHT 40
#define IMAGE_WIDTH 30
#define IMAGE_SIZE IMAGE_HEIGHT * IMAGE_WIDTH

#define BLOCK_HEIGHT 4
#define BLOCK_WIDTH 3
#define BLOCK_SIZE BLOCK_HEIGHT * BLOCK_WIDTH

int main(){
    std::cout << "image size: " << IMAGE_SIZE << std::endl;
    std::cout << "block size: " << BLOCK_SIZE << std::endl;
    std::cout << "# of blocks in a image: " << (IMAGE_SIZE / BLOCK_SIZE) << std::endl;
    return 0;
}

出力

image size: 1200
block size: 1200
# of blocks in a image: 900

(とりあえずの)修正

コード

#defineがやってるのは文字列置換なのでカッコを明記する。(thx. toori様)
* 修正前:IMAGE_HEIGHT * IMAGE_WIDTH / BLOCK_HEIGHT * BLOCK_WIDTH
* 修正後:((IMAGE_HEIGHT) * (IMAGE_WIDTH)) / ((BLOCK_HEIGHT) * (BLOCK_WIDTH))

after.cpp
#include <iostream>

#define IMAGE_HEIGHT 40
#define IMAGE_WIDTH 30
#define IMAGE_SIZE ((IMAGE_HEIGHT) * (IMAGE_WIDTH)) // !!!

#define BLOCK_HEIGHT 4
#define BLOCK_WIDTH 3
#define BLOCK_SIZE ((BLOCK_HEIGHT) * (BLOCK_WIDTH)) // !!!

int main(){
    std::cout << "image size: " << IMAGE_SIZE << std::endl;
    std::cout << "block size: " << BLOCK_SIZE << std::endl;
    std::cout << "# of blocks in a image: " << (IMAGE_SIZE / BLOCK_SIZE) << std::endl;
    return 0;
}

ただし、以上の書き方はC++の書き方としてかなり宜しくない模様。なぜ拡張子をcppにした
(コメント参照。thx. yumetodo様, ryoco様, amate様, y_itamoto様

出力

image size: 1200
block size: 12
# of blocks in a image: 100

教訓とか

  • 何となく使ってる構文とかが何やってるか正確に理解してないと事故る
  • こういう習慣で防げる系のミスは初学者のうちに潰したい
  • とりあえずおちつく
  • (追記)些細な出来事を書いたら結果的に勉強になった(ありがとうございます)
1
0
10

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0