Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why can't I do ++i++ in C-like languages?

Half jokingly half serious : Why can't I do ++i++ in C-like languages, specifically in C#?

I'd expect it to increment the value, use that in my expression, then increment again.

like image 950
Stop Putin Stop War Avatar asked Oct 02 '09 18:10

Stop Putin Stop War


People also ask

Can we write ++ i ++ in C program?

The result of the operation is a value of the same type as the operand. NB: The term lvalue is used in C and C++ only. And for the sake of diversity in C the result of prefix increment is actually rvalue so you can't increment increment in C.

What can I do in C that I cant do in C++?

You can do almost everything in any of the programming languages. Of course the way of expressing it will vary, as well as the amount of code, clarity of code, ease of further maintenance. Some tasks can be coded with few lines in Prolog and few pages of code in C++, and so on.

Is C or C++ used more?

At the professional level, C++ is the far more common language worldwide. As mentioned earlier, many programming opportunities in the workforce require knowledge of C++ for consideration. More applications are written entirely in C++, and it's rare to find a program written in just C.

Is C still relevant?

C exists everywhere in the modern world. A lot of applications, including Microsoft Windows, run on C. Even Python, one of the most popular languages, was built on C. Modern applications add new features implemented using high-level languages, but a lot of their existing functionalities use C.


2 Answers

Though the short answer "it's not an lvalue" is correct, that's perhaps just begging the question. Why isn't it an lvalue? Or, as we say in C#, a variable.

The reason is because you cannot have your cake and eat it too. Work it out logically:

First off, the meaning of a ++ operator in C#, whether postfix or prefix, is "take the value of this variable, increment the value, assign the new value to the variable, and produce a value as a result". The value produced as the result is either the original value or the incremented value, depending on whether it was a postfix or a prefix. But either way, you produce a value.

Second, the value of a variable is always the current contents of that variable. (Modulo certain bizarre threading scenarios that would take us far afield.)

I hope you agree that these are perfectly sensible rules.

Now it should be clear why the result of i++ cannot be a variable, but in case it isn't, let me make it clear:

Suppose i is 10. The meaning of i++ should be "get the value of i — 10 — increment it — 11 — store it — i is now 11 — and give the original value as the result — 10". So when you say print(i++) it should print 10, and 11 should be stored in i.

Now suppose the meaning of i++ is to return the variable, not the value. You say print(i++) and what happens? You get the value of i — 10 — increment it — 11 — store it — i is now 11 — and give the variable back as a result. What's the current value of the variable? 11! Which is exactly what you DON'T want to print.

In short, if i++ returned a variable then it would be doing exactly the opposite of the intended meaning of the operator! Your proposal is logically inconsistent, which is why no language does it that way.

like image 67
Eric Lippert Avatar answered Sep 20 '22 07:09

Eric Lippert


Short answer: i++ is not an "lvalue", so can't be the subject of an assignment.

like image 38
Simon Nickerson Avatar answered Sep 21 '22 07:09

Simon Nickerson