|
The article describes it for ASP.NET, I need the window app, and I can't find anything useful.
|
|
|
|
|
To use ReportDocument object, what System directives I have to load?
Thank you.
|
|
|
|
|
Hello, guys
I found an interesting topic on MS newsgroup. And I'd like to ask you a simple question. What is the value of "i " variable after the code ?
int i = 5;
i = i++;
???
Provide me, please, with an answer you though/expected just after you looked at the code. And then, any ideas why does C# compiler work so ? (if you will run the code, you will understand what I mean).
With best regards,
Andrew
|
|
|
|
|
The value of i will be 5 because the i++ increments the value AFTER the assignment.
If you want i to be 6 then you can do it like this:
<br />
int i = 5;<br />
i = ++i;<br />
The method above increments the value BEFORE the assignment.
By the way, this is not just a C# thing, any C syntax language shoould behave this way (incl. java, javascript, C++ etc..)
Si
|
|
|
|
|
Anonymous wrote:
By the way, this is not just a C# thing, any C syntax language shoould behave this way (incl. java, javascript, C++ etc..)
Yes, maybe other languages also should, but C++ produces 6. (managed and unmanaged versions).
With best regards,
Andrew
|
|
|
|
|
I guess "5"
It's actually the same with C(++), because the expression i++ is evaluated AFTER the statement.
modified 12-Sep-18 21:01pm.
|
|
|
|
|
Greeeg wrote:
It's actually the same with C(++),
Not the same. I've checked on my VS 2003.
With best regards,
Andrew
|
|
|
|
|
Problem is there in your example. Try to use different variable to distingush the difference.
int i=5,j=0;<br />
j=i++;
Sreejith Nair
[ My Articles ]
|
|
|
|
|
Sreejith SS Nair wrote:
Problem is there in your example.
I know that my example is useless. It was interesting another thing: C(++) gives 6, but C# gives 5.
Never mind, the C# behavior is good described in MSDN[^].
With best regards,
Andrew
|
|
|
|
|
You wrote : Provide me, any ideas why does C# compiler work so ?
I post answer for your queary. And sorry if you twist the issue.
Sreejith Nair
[ My Articles ]
|
|
|
|
|
|
Andrew Kirillov wrote:
int i = 5;
i = i++;
Easy, 5. The value of i is incremented after the expression is evaluated.
In this example:
Andrew Kirillov wrote:
int i = 5;
i = ++i;
Here, i will be 6. The value of i is incremented before the expression is evaluated.
This is all defined functionality in the C# language specification. C and C++ do the same thing.
7.5.9 Postfix increment and decrement operators[^]
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
Dave Kreskowiak wrote:
C and C++ do the same thing.
No ! I wrote it alredy. I've tested it with VS.NET 2003. C++ (managed and unmanaged) gives 6.
With best regards,
Andrew
|
|
|
|
|
Andrew Kirillov wrote:
No ! I wrote it alredy. I've tested it with VS.NET 2003. C++ (managed and unmanaged) gives 6.
Then I'd say the problem is with C++ not with C#.
Try this:
<br />
int i = 5;<br />
if (i++ == 5)<br />
{<br />
Console::WriteLine("Five");<br />
}<br />
else<br />
{<br />
Console::WriteLine("Six");<br />
}<br />
In C# and C++ you should get "Five" as a result.
|
|
|
|
|
Wjousts wrote:
Try this:
....
In C# and C++ you should get "Five" as a result.
Yes, I know. It will be the same in both languages. I was interested in original code I wrote.
With best regards,
Andrew
|
|
|
|
|
Actually you are right, it should be 6 (in your original code) in both C++ and C#. Nasty trick question that. So it would appear to be a problem with the C# compiler.
|
|
|
|
|
After doing some digging, the evaluation rules are slightly different between the C++ language specifications and the C# specs. It's not a bug as far the specifications describes the process.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
No, I think it is a bug, evaulation rules or not. It's very easy to miss (and I did at first) but the prefix/postfix thing is irrelevant:
<br />
int i = 5;<br />
i = i++;<br />
versus
<br />
int i = 5;<br />
i = ++i;<br />
Should both end up with i = 6. i++ is the same as i = i + 1 (so is ++i) so really the both code snippets should become
<br />
int i = 5;<br />
i = i;<br />
i = i + 1;<br />
and
<br />
int i = 5;<br />
i = i + 1;<br />
i = i;<br />
It shouldn't matter if you do i = i first or i = i + 1 first the result should still be six.
As somebody else pointed out, it you do j = i++ then look at the value of j then the prefix/postfix part matters, but because you are putting the result back in to i it should be six either way.
|
|
|
|
|
According the doc's I read in the specifications, the result your seeing is the expected result of the expression.
C# in 2002, 2003, and 2005 do the exact same thing. The specifications between versions didn't change.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
The specifications concerning the behavor of postfix and prefix increment aren't relavent. The result should be 6 either way!
i = i++;
i gets assigned 5 and then i gets incremented. Therefore i = 6.
|
|
|
|
|
Wjousts wrote:
i gets assigned 5 and then i gets incremented. Therefore i = 6.
That's not the normal execution order.
The real execution order (in C#) is:
Read value of i
Increment i
Assign old value of i to i
Why should the "++" wait until after the assignment? It directly binds to "i":
AssignmentExpression: Left=i Op=Assign Right=[UnaryExpression: Op=PostIncrement Expr=i]
It behaves differently in C++ because C++ has very strange rules for execution order.
|
|
|
|
|
Wjousts wrote:
The specifications concerning the behavor of postfix and prefix increment aren't relavent.
WHAT?! Then why have a language specification at all? They detail the inner workings of the instruction set and execution order.
According to the C/C++ language specifications, the value should be 6. Stop applying C/C++ specifications to C#.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
Dave Kreskowiak wrote:
WHAT?! Then why have a language specification at all? They detail the inner workings of the instruction set and execution order.
Not relevant to this problem.
You are still not getting this. i++ is logically equavalent to i=i+1 correct? If i do i=i+1 I should get the same value in i as I would if I just did i++, correct? So then:
<br />
int i = 5;<br />
i = i++;<br />
should give the same result as:
<br />
int i = 5;<br />
i = i;<br />
i = i + 1;<br />
Correct? Therefore i should equal 6. Show me where the flaw is? Both the assignment and the increment have to happen before the code has finished executing therefore it really doesn't matter which one happens first.
Compare these:
<br />
int i = 5;<br />
i++;<br />
Console.Writeline(i.ToString());<br />
<br />
int i = 5;<br />
++i;<br />
Console.Writeline(i.ToString());<br />
What's the output in both cases? Would you agree that the postfix or prefix notation doesn't change the output in this case?
|
|
|
|
|
Wjousts wrote:
i++ is logically equavalent to i=i+1 correct?
No, it's not! i++; is equivilent to i=i+1 . Your flaw is not understand the execution order of the operators and assignments you're using. This works like you want it to:
int i = 5;
i++;
Console.WriteLine(i.ToString());
You're not understanding the procedures, order, and times in which each operation takes place. It's already been explained to you in the C# Language Specifications.
Wjousts wrote:
Would you agree that the postfix or prefix notation doesn't change the output in this case?
It's not the operators that are changing the output. It's, again, the execution order and times of the operators in question. What do you think the output of these are?:
int i = 5;
Console.WriteLine((i++).ToString());
int i = 5;
Console.WriteLine((++i).ToString());
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
Dave Kreskowiak wrote:
Wjousts wrote:
i++ is logically equavalent to i=i+1 correct?
No, it's not! i++; is equivilent to i=i+1.
So no, you agree???
You're still missing the point. First, this wasn't my question. i = i++ is redudant and a silly thing to try and do in the first place! The point is that in that statement that the original poster posted the incremement part, the i++ is NEVER EXECUTED. Where in the C# specification does it say that the compiler will randomly ignore increment statements whenever it feel like it? Please so me the exact section that says that.
It's not an issue of execution order because ALL THE STATEMENTS ARE SUPPOSED TO BE EXECUTED!
|
|
|
|