What does the unary plus operator do?
It's there to be overloaded if you feel the need; for all predefined types it's essentially a no-op.
The practical uses of a no-op unary arithmetic operator are pretty limited, and tend to relate to the consequences of using a value in an arithmetic expression, rather than the operator itself. For example, it can be used to force widening from smaller integral types to int
, or ensure that an expression's result is treated as an rvalue and therefore not compatible with a non-const
reference parameter. I submit, however, that these uses are better suited to code golf than readability. :-)
What is the purpose of the unary plus (+) operator in C?
As per the C90 standard in 6.3.3.3:
The result of the unary + operator is the value of its operand. The integral promotion is
performed on the operand. and the result has the promoted type.
and
The operand of the unary + or - operator shall have arithmetic type..
What is the purpose of Java's unary plus operator?
The unary plus operator performs an automatic conversion to int
when the type of its operand is byte
, char
, or short
. This is called unary numeric promotion, and it enables you to do things like the following:
char c = 'c';
int i = +c;
Granted, it's of limited use. But it does have a purpose. See the specification, specifically sections §15.15.3 and §5.6.1.
What's the point of unary plus operator in Ruby?
Perhaps it's just a matter of consistency, both with other programming languages, and to mirror the unary minus.
Found support for this in The Ruby Programming Language (written by Yukihiro Matsumoto, who designed Ruby):
The unary plus is allowed, but it has no effect on numeric operands—it simply returns the value of its operand. It is provided for symmetry with unary minus, and can, of course, be redefined.
What's the significant use of unary plus and minus operators?
The Unary +
operator converts its operand to Number type.
The Unary -
operator converts its operand to Number type, and then negates it.
(per the ECMAScript spec)
In practice, Unary -
is used for simply putting negative numbers in normal expressions, e.g.:
var x = y * -2.0;
That's the unary minus operator at work. The Unary +
is equivalent to the Number() constructor called as a function, as implied by the spec.
I can only speculate on the history, but the unary +/- operators behave similarly in many C-derived languages. I suspect the Number() behavior is the addition to the language here.
Why would one want to put a unary plus (+) operator in front of a C++ lambda?
It's not a feature of lambda and more is a feature of implicit type conversion.
What happens there is stemming from the fact that a captureless lambda can be implicitly converted to a pointer to function with same signature as lambda's operator()
. +[]{}
is an expression where unary +
is a no-op , so the only legal result of expression is a pointer to function.
In result auto funcPtr
would be a pointer to a function, not an instance of an object with anonymous type returned by lambda expression. Not much of advantage in provided code, but it can be important in type-agnostic code, e.g. where some kind of decltype
expression is used. E.g.
#include <type_traits>
void foo(int);
template<class T>
struct is_foo : std::is_same<T, decltype(&foo)> {};
int main()
{
auto foo1 = +[](int)->void {};
auto foo2 = [](int)->void {};
static_assert(is_foo<decltype(foo1)>::value, "foo1 is not like foo");
static_assert(is_foo<decltype(+foo2)>::value, "+foo2 is not like foo");
static_assert(is_foo<decltype(foo2)>::value, "foo2 is not like foo");
}
Note that you can do same with foo
: std::is_same<T, decltype(+foo)> {};
Albeit some platforms may not support that, because they inherently may have a variety of function pointers with different calling convention and the expression will be ambiguous.
What does the unary plus operator do in Excel formulas?
In some of those examples, e.g. for WORKDAY
and QUOTIENT
, the +
is converting a range to an array
Many of the old Analysis ToolPak
functions like WORKDAY
, NETWORKDAYS
, WEEKNUM
etc. won't accept a range as an argument, but in Excel 2007
or later excel versions they will accept an array as an argument - using +0
or --
(or apparently +) will convert the range to an array, so in Excel 2007 if you use a formula like this:
=AVERAGE(WEEKNUM(A1:A3))
where A1:A3 contain dates
....it will return an error
but this version (array entered with CTRL+SHIFT+ENTER) will work to give you the average of the week numbers:
=AVERAGE(WEEKNUM(+A1:A3))
What is the purpose of a unary + before a call to std::numeric_limitsunsigned char members?
The output operator <<
when being passed a char
(signed or unsigned) will write it as a character.
Those function will return values of type unsigned char
. And as noted above that will print the characters those values represent in the current encoding, not their integer values.
The +
operator converts the unsigned char
returned by those functions to an int
through integer promotion. Which means the integer values will be printed instead.
An expression like +std::numeric_limits<unsigned char>::lowest()
is essentially equal to static_cast<int>(std::numeric_limits<unsigned char>::lowest())
.
Related Topics
What Is the Overhead of Creating a New Httpclient Per Call in a Webapi Client
Load a Wpf Bitmapimage from a System.Drawing.Bitmap
Do Event Handlers Stop Garbage Collection from Occurring
String Was Not Recognized as a Valid Datetime " Format Dd/Mm/Yyyy"
Getting "Type or Namespace Name Could Not Be Found" But Everything Seems Ok
Why Xml-Serializable Class Need a Parameterless Constructor
Ef Codefirst: Should I Initialize Navigation Properties
Get Name of a Variable or Parameter
How to Open a Chrome Profile Through --User-Data-Dir Argument of Selenium
How to Get the Index of the Current Iteration of a Foreach Loop
Copy the Entire Contents of a Directory in C#
C# Lambda Expressions: Why Should I Use Them
Transactionscope Automatically Escalating to Msdtc on Some Machines
Programmatic Equivalent of Default(Type)
Why Is Thread.Sleep So Harmful