このマクロ関数がなぜ狂うのかわかりません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
sadora3
記事: 175
登録日時: 11年前

このマクロ関数がなぜ狂うのかわかりません

#1

投稿記事 by sadora3 » 9年前

コード:

#include<stdio.h>
#include<math.h>

#define rad(a) (a * 3.141592653589 / 180.0)

void main(){
	printf("%f %f\n", cos(rad(0)), cos(rad(10)));
	printf("%f %f\n", cos(rad(10)), cos(rad(20)));
	printf("%f %f\n\n", cos(rad(20)), cos(rad(30)));

	for(int i = 0; i < 30; i += 10){
		printf("%f %f\n", cos(rad(i)), cos(rad(i + 10)));
	}
}
[実行結果]
1.000000 0.984808
0.984808 0.939693
0.939693 0.866025

1.000000 0.984808
0.984808 -0.731856
0.939693 0.243351

このようなプログラムを書いたのですが、forの中のマクロ関数の部分がおかしくなります。

printf("%f %f\n", cos(rad(i)), cos(rad((i + 10))));
このようにすると正常に動いてくれるのですが、どうしておかしくなったのでしょうか?

アバター
usao
記事: 1887
登録日時: 11年前

Re: このマクロ関数がなぜ狂うのかわかりません

#2

投稿記事 by usao » 9年前

そのマクロだと
rad(i + 10)
は,
(i + 1 * 3.141592653589 / 180.0)
になってしまうのではないでしょうか.

naohiro19
記事: 256
登録日時: 13年前
住所: 愛知県

Re: このマクロ関数がなぜ狂うのかわかりません

#3

投稿記事 by naohiro19 » 9年前

コンパイル時に以下のように展開されるからです。
cos(0*3.141592653589 / 180.0), cos(10*3.141592653589 / 180.0)

box
記事: 2002
登録日時: 13年前

Re: このマクロ関数がなぜ狂うのかわかりません

#4

投稿記事 by box » 9年前

こういう風に書きましょう。4行目。

コード:

#include <stdio.h>
#include <math.h>

#define rad(a) ((a) * 3.141592653589 / 180.0)

int main(void)
{
    printf("%f %f\n", cos(rad(0)), cos(rad(10)));
    printf("%f %f\n", cos(rad(10)), cos(rad(20)));
    printf("%f %f\n\n", cos(rad(20)), cos(rad(30)));

    for(int i = 0; i < 30; i += 10){
        printf("%f %f\n", cos(rad(i)), cos(rad(i + 10)));
    }
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

sadora3
記事: 175
登録日時: 11年前

Re: このマクロ関数がなぜ狂うのかわかりません

#5

投稿記事 by sadora3 » 9年前

ああ!なるほどです!
普通にaに代入すれば分かったことなのに、無駄な質問をしてしまいました・・・。皆さんの貴重な時間を奪ってしまい申し訳ありません。
回答してくれた皆さんありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る