2016-05-19 5 views
2

私は狂っていると思う。それは、その後3 =ループカウンタに一瞬で Cプリプロセッサ#define SQR(x)(x * x)

括弧なしで故意I(x)は(Xの*のX)SQRを定義し、
#include <stdio.h> 
#define SQR(x) (x * x) 
int main() 
{ 
    int counter; /* counter for loop */ 
    for(counter = 0; counter < 5; ++counter) 
    { 
     printf("x %d, x squared %d\n",counter+1, SQR(counter+1)) 
    } 
    return (0); 
} 

をする必要があり、私はCプリプロセッサを学んだし、私はこの問題を把握することはできません

x 1, x squared 1 
x 2, x squared 3 
x 3, x squared 5 
x 4, x squared 7 
x 5, x squared 9 

Process returned 0 (0x0) execution time : 0.020 s 
Press any key to continue. 

私は明らかに何かが欠けているが、私はそれを理解することはできません:3 + 1 * 3 + 1とそれが7に等しいですが、出力はここ5 は、上記のコードの出力であると言うことでる。

+2

あなたはそれがあなたの回答は1で一致していないので、追加1でカウンターを印刷している7で正しいです。 – LogicG8

+0

'x 3 'を印刷すると、' counter'は '2'です。 – user2357112

+0

そうですが、プリントはっきり言っています: "x 3、x squared 5" 私は比較+ 1を使ってプリントし、次に+1を計算と比較します。 同じ値 – honeyPot

答えて

4

カウンタが3の場合、counter+1を印刷するため、と表示されます。用途:

printf("x %d, x squared %d\n",counter, SQR(counter+1)); 

カウンタの実際値が何であるかを確認します。最も明白な誤りがIgnaus'の答えで指摘脇から

+1

Yeapをoverthinked、愚かな私は...ありがとう – honeyPot

+0

まだ正しくありません。 –

+0

@CareyGregory OPは、彼がこの問題について知っていると、彼はうーん...あなたは正しい – squill25

0

、あなたはここで、第二より陰湿かつより危険なエラーを持っています。

SQR(counter+1) 

は次のようになります:それはこのように書かれたかのように実行されます

counter+1 * counter+1 

counter + (1 * counter) + 1 

明らかに間違っているプリプロセッサはSQR上で行うということ置換を行いますあなたが意図したものではありません。マクロの場合、は常にで、引数はかっこで囲む必要があります。だからあなたのマクロは次のようになります。

#define SQR(x) ((x) * (x)) 

は今再び置換を行うと、あなたが得る:正しい

((counter+1) * (counter+1)) 

を。 に常に慣れてください。には、これらの種類のエラーを避けるために、マクロ引数をかっこで囲みます。

+0

これは良い点ですが、OPは彼がこれについて知っていて目的を果たしていると言っています – squill25

+0

本を読んで、この例では小括弧などを使用する必要があることを示していますが、 ... – honeyPot

+0

@honeyPotあなたは '()'のかっこ '{}'をかっこで囲みます。右? –

関連する問題