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;
}
|
|
0
|
|
|
|
Reply
|
meenu_kg (26)
|
7/27/2005 5:39:48 AM |
|
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
|
|
0
|
|
|
|
Reply
|
jacob (2538)
|
7/27/2005 5:46:26 AM
|
|
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>
|
|
0
|
|
|
|
Reply
|
cfajohnson (1783)
|
7/27/2005 6:17:28 AM
|
|
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;
> }
>
|
|
0
|
|
|
|
Reply
|
mambuhl (2201)
|
7/27/2005 6:36:30 AM
|
|
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;
> }
|
|
0
|
|
|
|
Reply
|
abhikbagchi (1)
|
7/27/2005 11:01:27 AM
|
|
"abhik" <abhikbagchi@gmail.com> 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 :)
|
|
0
|
|
|
|
Reply
|
keramida (459)
|
7/27/2005 12:49:02 PM
|
|
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
|
|
0
|
|
|
|
Reply
|
pichlo7 (221)
|
7/31/2005 12:09:38 PM
|
|
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
|
|
0
|
|
|
|
Reply
|
fusionfive (551)
|
8/1/2005 11:49:58 PM
|
|
|
7 Replies
70 Views
(page loaded in 0.142 seconds)
|