i run the following programme under vc, gcc and tc:

#include <stdio.h>

#define CUBIC(x) ((x) * (x) * (x))

int main()

{

int x = 5;

int y = CUBIC(++x);

printf("y=%d\n",y);

}

and get the results separately as follow:

y=392 under vc and gcc

y=512 under tc

why?

if y = CUBIC(x++), i get 125 under all the above compilers. why? i had thought the result will be depend on compiler and will be different.

#include <stdio.h>

#define CUBIC(x) ((x) * (x) * (x))

int main()

{

int x = 5;

int y = CUBIC(++x);

printf("y=%d\n",y);

}

and get the results separately as follow:

y=392 under vc and gcc

y=512 under tc

why?

if y = CUBIC(x++), i get 125 under all the above compilers. why? i had thought the result will be depend on compiler and will be different.

Experts Exchange Solution brought to you by

Enjoy your complimentary solution view.

Get every solution instantly with Premium.
Start your 7-day free trial.

I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

First i must tell you there is some difference in the expression evaluation in various compilers....

TC handles the expression differently and VC handles it differently.....

In TC environment if one variable is occured many times in a expression then the final value of that vairable is substituted in all the places of its occurence......

The #define will replace CUBIC(++x) to

y = (++x) * (++x) * (++x) ;

So in TC first the value(final valule) of x is calcuated and then it is substituted in all its occurances....

so the final value of x after this expression will be 8

so y = 8 * 8 * 8 ; = 512....

Now in VC the value of x(or any variable) is done at the time of postfix evaluation....

NOTE:: In Computer expressions are normally evaluated by postfix evalutaion technique...

The postfix expression for (++x) * (++x) * (++x)

is (++x)(++x)*(++x)*

so first (++x)(++x)* is calculated so the value of x is calculated here... here x is incremented twice so x = 7

(7)(7)* = 49....

Now the expression becomes (49)(++x) * and the value of x = 7;

Now again calculate (49)(++x)* after increment x becomes 8

so (49)(8)* = 392...

So i hope u got some idea...

Dennis

With code like this, the language definition does not specify the order of the operations, so different compilers can do different things or the same thing without failing to conform to the standard.

So as a practical matter, it is better to avoid code like this than try to understand what it will do, because what it will do can legitimately vary from one compiler to another.

See also:

http://www.experts-exchange.com/Programming/Programming_Languages/C/Q_20638918.html

--efn

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trialThank you.

Can the result be 6*7 when (++x)(++x)* is calculated? If x is increased and used its value,6,and then increased again and used its value, 7, and at last ...6*7.

Can you tell me whether the analysis above is ture?

bourbaki

No i don't think so...... when the compiler evaluate the value of a postfix expression, like (++x)(++x)*, it first calculates its value. Actually the postfix evaluation takes place in stack. both (++x) will be in stack. so before calculating the result it pops out the variables and calculates its value...so after two increments the value of x will be 7. so the compiler will calculate 7 * 7 not 6 * 7..... because during calculation of result it does not substitute the value after getting each variable but only after getting both the operands....

Dennis

C

From novice to tech pro — start learning today.

Experts Exchange Solution brought to you by

Enjoy your complimentary solution view.

Get every solution instantly with Premium.
Start your 7-day free trial.

I'll explain why I thought of 512

As you have a define, then the preprocessor would replace it before compiling it, so your code would be like this. (After preprocessing)

int main()

{

int x = 5;

int y = ( (++x) * (++x) * (++x) ); // Important Line

printf("y=%d\n",y);

}

When it gets to "Important Line", it does the following

the first ++x so x = 6

then the second ++x so x = 7

then the third ++x so x = 8

then it evaluates y = 8 * 8 * 8;

then y = 512;

The reason for Cubic( x++ ) = 125 is that in that case

first y is assigned and afterwards x is incremented, so the y value is not influenced by the autoincrement operators

Hope this helps

Tincho