|
Am I the only one to spot that at least one of the problems in your last line is not related to increment and decrement at all? The operator+ which is invoked here needs to evaluate both of its operands, but it's undefined whether the first or second operand is evaluated first - the compiler may choose to do either!
So, if the compiler evaluates the first operand first, the following happens:
i = 10;
i = i + 1; first_arg = i;
second_arg = i;
i = i + 1; result = first_arg + second_arg;
Now consider the same on the assumption the compiler evaluates the second operand first:
i = 10;
second_arg = i;
i = i + 1; i = i + 1; first_arg = 1;
result = first_arg + second_arg;
In this case, the results are the same, but that is just by coincidence - if you had used subtraction in stead of addition you'd be in for a surprise!
You may want to check http://en.cppreference.com/w/cpp/language/eval_order[^] for further information regarding both function argument evaluation and increment/decrement.
GOTOs are a bit like wire coat hangers: they tend to breed in the darkness, such that where there once were few, eventually there are many, and the program's architecture collapses beneath them. (Fran Poretto)
|
|
|
|
|
That was exactly my point.
Veni, vidi, abiit domum
|
|
|
|
|
|
You are making unwarranted assumptions!
It's more complex that that - Richard is right, you shouldn't mix 'em - see my post below for some compiler nasties...
Never underestimate the power of stupid things in large numbers
--- Serious Sam
|
|
|
|
|
I know increment and decrement operator depend on compiler. actually i had tried it in dev c++.
|
|
|
|
|
If you know that something is compiler dependant, then you can't say "it is like this" - because there is a very good chance that the other person is not using the same compiler!
Never underestimate the power of stupid things in large numbers
--- Serious Sam
|
|
|
|
|
|
int i = 0;
i++;
Means that i is incremented after the statements execution
++i;
Means that i is incremented before the statements execution
The same is applicable on i-- and --i
Veni, vidi, caecus | Everything summarizes to Assembly code
|
|
|
|
|
O God....wow I am not the only one who is confused? This is the problem I specified when I started this thread, I got surprising answers when i solve these inc and dec problems.So who is correct please tell me and whom explaination I go with to pursue my learning on this topic?
|
|
|
|
|
Pre- and post- fix increment and decrement operations are pretty easy in theory, it's only when people get creative that you get problems in practice.
Basically, a prefix (++i or --i) says to increase or decrease the value before you use the variable, so the variable has the new value immediately:
i = 10;
x = ++i + 5; Can be read as:
i = 10;
i = i + 1;
x = i + 5; and similarly for the -- version:
i = 10;
x = --i + 5;
Can be read as:
i = 10;
i = i - 1;
x = i + 5;
The postfix version (i++ or i--) does the same thing, but after the variable has been used:
i = 10;
x = i++ + 5; Can be read as:
i = 10;
x = i + 5;
i = i + 1; And similarly
i = 10;
x = i-- + 5;
Can be read as:
i = 10;
x = i + 5;
i = i - 1;
The trouble comes when you start mixing operations on the same line (as Richard said):
i = 10;
x = ++i + i++; The problem is that the language specification does not define exactly when pre- and post- fix operations should occur! Which means that it's implementation specific exactly what you get as a result: The value of i should always be the same: 12 but the value of x can be different depending on the compiler (and to an extent on the target processor - ARM for example has built in pre- and post- fix increment and decrement to it's "machine code" LOAD operations, so it would be quite likely that an efficient compiler would use them directly)
Should it be executed as:
i = 10;
i = i + 1;
x = i + i;
i = i + 1; Which gives the result 22
or as
i = 10;
i1 = i;
i = i + 1;
x = i1 + i;
i = i + 1; Which gives 21
Or as
i = 10;
i1 = i;
i = i + 1;
x = i + i1;
i = i + 1; which also gives 21 by a different route
And bear in mind that the compiler does not have to evaluate the two operands of "+" in left to right order, so it could even give some very strange and unexpected results! Like 23...
So avoid combining them: use them for "simple expressions" such as incrementing an array index each time round a loop, but don't get fancy, or your code may well fail in interesting ways...
Never underestimate the power of stupid things in large numbers
--- Serious Sam
|
|
|
|
|
Thanks sir for highlighting its deep concepts related to the compiler. I hope now I am able to solve these question without getting shocked by their answers. Appreciate all your responses.
|
|
|
|
|
You're welcome!
Never underestimate the power of stupid things in large numbers
--- Serious Sam
|
|
|
|
|
Hello!
I just want to pass through all the siblings of a parent CTreeCtrl node.
So I do something like the code from msdn http://msdn.microsoft.com/en-us/library/xfh3f9zt.aspx[^]:
if (m_TreeCtrl.ItemHasChildren(hmyItem))
{
HTREEITEM hItem = m_TreeCtrl.GetChildItem(hmyItem);
while (hItem != NULL)
{
hItem = m_TreeCtrl.GetNextSiblingItem(hItem);
}
}
The problem is that, GetNextSiblingItem never returns null. When all the siblings are passed through and the function should return null, it just returns the first sibling. So it enters into an infinite loop. I just cannot understand why it does so.
|
|
|
|
|
I had used this code several time without any problem ... so, check your code again, eventually load the tree with few simple test items ...
|
|
|
|
|
|
I had created an dialog based project, where I put an tree control, named m_Tree, and in OnInitDialog I wrote following code:
HTREEITEM hItem = m_Tree.InsertItem(_T("One"));
m_Tree.InsertItem(_T("Test1"), hItem);
m_Tree.InsertItem(_T("Test2"), hItem);
m_Tree.InsertItem(_T("Test3"), hItem);
m_Tree.InsertItem(_T("Two"));
m_Tree.InsertItem(_T("Three"));
HTREEITEM hRoot = m_Tree.GetRootItem();
if(m_Tree.ItemHasChildren(hRoot))
{
HTREEITEM hChild = m_Tree.GetChildItem(hRoot);
while(NULL != hChild)
{
TRACE("%s\n", m_Tree.GetItemText(hChild));
hChild = m_Tree.GetNextSiblingItem(hChild);
}
}
which are similar with yours, and I get this:
Test1
Test2
Test3
You could try it ...
modified 13-Jan-14 3:48am.
|
|
|
|
|
Thanks for your answer!
I know it works, because I tried another similar tree myself. But I really do not know why it does not work in a particular case. What I am trying to do is to copy a CTreeCtrl from Dialog1 to Dialog2. So I do something like Dialog1::_tree1.GetNextSiblingItem(ci) and then put ci in _tree2 which is in Dialog2, like this _tree2.InsertItem(csChild,NULL, NULL), where csChild = Dialog1::_tree1.GetItemText(ci).
So it may be that this cross dialog thing is the problem.
|
|
|
|
|
How can I know which are short time format programatically ? Just like Windows Explorer show on files date modified ... Thank you.
|
|
|
|
|
I'm not really sure what you are trying to do but the Locale[^] functions may help you.
Veni, vidi, abiit domum
|
|
|
|
|
I think I found something: GetLocaleInfo with LOCALE_SSHORTDATE ... thank you.
|
|
|
|
|
I didn't find LOCALE_SSHORTTIME in GetLocaleInfo, so how can I find short time format ?
modified 6-Jan-14 8:22am.
|
|
|
|
|
|
Yes, that I had checked in MSDN help, but none of these shows the short time format, just long time format ...
|
|
|
|
|
It was introduced with Windows 7. In any case, the short format is typically the long format minus the "ss" pattern.
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"Show me a community that obeys the Ten Commandments and I'll show you a less crowded prison system." - Anonymous
|
|
|
|
|
Yes, indeed, I saw no short time format in XP ... thank you all.
|
|
|
|