Velocity Reviews > #define

# #define

Meenu
Guest
Posts: n/a

 07-27-2005
the value of a is 11, how??

#define SQR(x) (x*x)
int main()
{
int a,b=3;
a=SQR(b+2);
printf("a=%d\n",a);
return 0;
}

jacob navia
Guest
Posts: n/a

 07-27-2005
Meenu a écrit :
> the value of a is 11, how??
>
> #define SQR(x) (x*x)
> int main()
> {
> int a,b=3;
> a=SQR(b+2);
> printf("a=%d\n",a);
> return 0;
> }
>

a = SQR(b+2) where SQR --> "b+2"
a = b+2*b+2
a = 3+(2*3)+2
a = 3+6+2
a = 11

Chris F.A. Johnson
Guest
Posts: n/a

 07-27-2005
On 2005-07-27, Meenu wrote:
> the value of a is 11, how??
>
> #define SQR(x) (x*x)

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

Otherwise:

3 + 2 * 3 + 2 = 3 + (2 * 3) + 2 = 11

> int main()
> {
> int a,b=3;
> a=SQR(b+2);
> printf("a=%d\n",a);
> return 0;
> }

--
Chris F.A. Johnson <http://cfaj.freeshell.org>
================================================== ================
Shell Scripting Recipes: A Problem-Solution Approach, 2005, Apress
<http://www.torfree.net/~chris/books/cfaj/ssr.html>

Martin Ambuhl
Guest
Posts: n/a

 07-27-2005
Meenu wrote:
> the value of a is 11, how??
>
> #define SQR(x) (x*x)
> int main()
> {
> int a,b=3;
> a=SQR(b+2);

is
a=b+2*b+2;
since the value of b is 3, the value of the expansion is
a=3+6+2;
= 11;
This is why, if you are _sure_ that there are no side effects in the
arguments to SQR() it should be
#define SQR(x) ((x)*(x))
But, of course, you have no such guarantees about no side effects. Both
versions die with
SQR(++b);
for example.
So, what you really want is
inline int square_int(int x) { return x*x; }

> printf("a=%d\n",a);
> return 0;
> }
>

abhik
Guest
Posts: n/a

 07-27-2005
hi meenu ,

see the problem here is that all the #defines are taken care at
preprocessing level .
So wat the compiler gets is not 5*5 but actually 3 + 2 * 3 + 2
which is 11

Meenu wrote:
> the value of a is 11, how??
>
> #define SQR(x) (x*x)
> int main()
> {
> int a,b=3;
> a=SQR(b+2);
> printf("a=%d\n",a);
> return 0;
> }

Giorgos Keramidas
Guest
Posts: n/a

 07-27-2005
"abhik" <(E-Mail Removed)> writes:
> Meenu wrote:
> > the value of a is 11, how??
> >
> > #define SQR(x) (x*x)
> > int main()
> > {
> > int a,b=3;
> > a=SQR(b+2);
> > printf("a=%d\n",a);
> > return 0;
> > }

>
> see the problem here is that all the #defines are taken care at
> preprocessing level .
> So wat the compiler gets is not 5*5 but actually 3 + 2 * 3 + 2
> which is 11

Which can easily be solved by proper use of parentheses:

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

This macro has yet another potential "bug", which is caused by using the
macro argument twice. If the "x" expression has side-effects they will
be doubled, yielding strange results in invocations like:

SQR(b++, b++)

But that's probably not what the original poster asked for

Peter Pichler
Guest
Posts: n/a

 07-31-2005
Giorgos Keramidas wrote:

> #define SQR(x) ((x) * (x))
>
> This macro has yet another potential "bug", which is caused by using the
> macro argument twice. If the "x" expression has side-effects they will
> be doubled, yielding strange results in invocations like:
>
> SQR(b++, b++)

....which would most likely not compile

(SQR takes ONE parameter)

Peter

akarl
Guest
Posts: n/a

 08-01-2005
Peter Pichler wrote:
> Giorgos Keramidas wrote:
>
>> #define SQR(x) ((x) * (x))
>>
>> This macro has yet another potential "bug", which is caused by using the
>> macro argument twice. If the "x" expression has side-effects they will
>> be doubled, yielding strange results in invocations like:
>>
>> SQR(b++, b++)

>
>
> ...which would most likely not compile
>
> (SQR takes ONE parameter)

Moreover, even if the function *did* take two parameters it would cause
problems (undefined behavior) even if it was a "true" function
(modification of a variable twice with no intervening sequence point).

August

 Thread Tools

 Posting Rules You may not post new threads You may not post replies You may not post attachments You may not edit your posts BB code is On Smilies are On [IMG] code is On HTML code is OffTrackbacks are On Pingbacks are On Refbacks are Off Forum Rules

Advertisments