Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > #define

Reply
Thread Tools

#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;
}

 
Reply With Quote
 
 
 
 
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
 
Reply With Quote
 
 
 
 
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>
 
Reply With Quote
 
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;
> }
>

 
Reply With Quote
 
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;
> }


 
Reply With Quote
 
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

 
Reply With Quote
 
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

 
Reply With Quote
 
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
 
Reply With Quote
 
 
 
Reply

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 Off
Trackbacks are On
Pingbacks are On
Refbacks are Off




Advertisments