Why do assignment statements return a value?
To my understanding, assignment s = "Hello"; should only cause "Hello" to be assigned to s, but the operation shouldn’t return any value.
Your understanding is 100% incorrect. Can you explain why you believe this false thing?
What is the reasoning behind allowing assignment statements to return a value?
First off, assignment statements do not produce a value. Assignment expressions produce a value. An assignment expression is a legal statement; there are only a handful of expressions which are legal statements in C#: awaits of an expression, instance construction, increment, decrement, invocation and assignment expressions may be used where a statement is expected.
There is only one kind of expression in C# which does not produce some sort of value, namely, an invocation of something that is typed as returning void. (Or, equivalently, an await of a task with no associated result value.) Every other kind of expression produces a value or variable or reference or property access or event access, and so on.
Notice that all the expressions which are legal as statements are useful for their side effects. That's the key insight here, and I think perhaps the cause of your intuition that assignments should be statements and not expressions. Ideally, we'd have exactly one side effect per statement, and no side effects in an expression. It is a bit odd that side-effecting code can be used in an expression context at all.
The reasoning behind allowing this feature is because (1) it is frequently convenient and (2) it is idiomatic in C-like languages.
One might note that the question has been begged: why is this idiomatic in C-like languages?
Dennis Ritchie is no longer available to ask, unfortunately, but my guess is that an assignment almost always leaves behind the value that was just assigned in a register. C is a very "close to the machine" sort of language. It seems plausible and in keeping with the design of C that there be a language feature which basically means "keep on using the value that I just assigned". It is very easy to write a code generator for this feature; you just keep on using the register that stored the value that was assigned.
What does assignment operator means in return statements, like return t =...?
In the return instructions, the operator assigns to t
which is a reference (modifies it) then returns the value.
That's what an incrementation operator does: modifies & returns reference at the same time so the incremented value can be used in another operation.
Why does the assignment operator return a value and not a reference?
It doesn't have to do with values vs. references, it has to do with this
values (as you suspected). In JavaScript, this
is set entirely by how a function is called, not where it's defined. You set the this
value in one of three ways:
- Call the function via an object property using property accessor notation, either dotted notation (
obj.foo()
) or bracketed notation (obj["foo"]()
). - Call the function via an object property using a
with
statement (really just a variant of #1, but worth calling out separately, particularly as it's not obvious from the source code) - Use the
apply
orcall
features of the function instance.
In your examples above, you're not doing any of those, so you end up calling the function with the default this
value, the global object, and so x
comes from there rather than from your foo
object. Here's another way to think about what that code is doing:
var f = foo.bar; // Not calling it, getting a reference to it
f(); // Calls the function with `this` referencing the global object
If you don't directly use a property to actually make the call (instead retrieving the value of the property and then making the call with that), the this
handling doesn't kick in.
What does an assignment expression evaluate to in Java?
The assignment operator in Java evaluates to the assigned value (like it does in, e.g., c). So here, readLine()
will be executed, and its return value stored in line
. That stored value is then checked against null
, and if it's null
then the loop will terminate.
Value returned by the assignment
That's the way the language was designed. It is consistent with most languages.
Having a variable declaration return anything other than undefined
is meaningless, because you can't ever use the var
keyword in an expression context.
Having assignment be an expression
not a statement
is useful when you want to set many variable to the same value at once:
x = y = z = 2;
It can also be used like this:
x = 2*(y = z); // Set y = z, and x = 2*z
However that is not the most readable code and it would probably be better written as:
y = z;
x = 2*z;
Why does Python assignment not return a value?
There are many who feel that having assignments be expressions, especially in languages like Python where any value is allowable in a condition (not just values of some boolean type), is error-prone. Presumably Guido is/was among those who feel that way. The classic error is:
if x = y: # oops! meant to say ==
The situation is also a bit more complicated in Python than it is in a language like C, since in Python the first assignment to a variable is also its declaration. For example:
def f():
print x
def g():
x = h()
print x
In these two functions the "print x
" lines do different things: one refers to the global variable x
, and the other refers to the local variable x
. The x
in g
is local because of the assignment. This could be even more confusing (than it already is) if it was possible to bury the assignment inside some larger expression/statement.
Related Topics
Identifying Last Loop When Using for Each
Using String Format to Show Decimal Up to 2 Places or Simple Integer
Easiest Way to Parse JSON Response
How to Register a Global Hot Key to Say Ctrl+Shift+(Letter) Using Wpf and .Net 3.5
Most Common C# Bitwise Operations on Enums
Using Protobuf-Net, I Suddenly Got an Exception About an Unknown Wire-Type
Httpwebrequest Using Basic Authentication
Find an Item in a List by Linq
How to Inject JavaScript in Webbrowser Control
How to Intercept a Method Call in C#
How to Read a File Even When Getting an "In Use by Another Process" Exception
Error: "Cannot Modify the Return Value" C#
Fixed Size Queue Which Automatically Dequeues Old Values Upon New Enques
What Does a Lock Statement Do Under the Hood
Entity Framework (Ef) Code First Cascade Delete for One-To-Zero-Or-One Relationship