Understanding Lvalues, PRvalues and Xvalues in C/C++ with Examples
Last Updated :
11 Jul, 2025
LValue and RValue in C
Background
Quite a few of you who are about to read this article, might be looking for clarification of what used to be basic: rvalues were thingies that can pop up on the right of an assignment operator, and lvalues were thingies that belong on the left or right an assignment operator. After all, this is how k&R distinguished certain expressions from others:
An object is a named region of storage; an lvalue is an expression referring to an object. An obvious example of an lvalue expression is an identifier with suitable type and storage class. There are operators that yield lvalues: for example, if E is an expression of pointer type, then *E is an lvalue expression referring to the object to which E points. The name "lvalue" comes from the assignment expression E1 = E2 in which the left operand E 1 must be an lvalue expression. The discussion of each operator specifies whether it expects lvalue operands and whether it yields an lvalue.
Unfortunately, such simple approaches are now stubborn mementos of the dark ages. When we are courageous enough to consult the more recent specifications, we have paragraph §3.10 throwing the following taxonomy in our faces:
expression
/ \
glvalue rvalue
/ \ / \
lvalue xvalue prvalue
Googling away for more human readable clarifications than the specification itself, the search results go into the difference between lvalue references and rvalue references, the fine nuances of move semantics, … All of these in fact advanced features that required this confusing hierarchy of fundamental concepts in the first place.
Well, this text offers something quite different: it will try to make some sense out of all of this for people having their first look at these terms, without requiring mood-enhancing methods to get through it all… We can even offer the first advice we need to take to heart:
Forget about assignments and thingies to the left and the right of the assignment operator.
The biggest challenge in this tree of semantic labels, is the mysterious xvalue. We don’t have to understand xvalues, that is for the snobs. We can limit ourselves to understanding lvalues and prvalues. If you already understand xvalues, you can give your golden “elite C++ programmer” plaque a quick polish, and look for different articles on putting those xvalues to good use. For the rest of us, we can rephrase the current paragraph as the second advice:
Focus on understanding lvalues and prvalues in a variety of expressions.
Lvalue
We’re talking about the syntax and semantics of expressions, and assignments are cleverly buried into the BNF (Backus-Naur-Form) of such expressions. That is why the second advice recommends forgetting about assignments. Because the specification is still pretty clear on what an lvalue is! But rather than deciphering lengthy descriptions, let’s just provide some source code examples:
// Designates an object
int lv1;
// Reference, designates an object
int &lv2 {lv1}
// Pointer, designates an object
int *lv3;
// Function returning a reference, designates an object
int &lv4() {
return lv1;
}
That’s it (more or less)! Well, we can figure out how classes are types, and class instances are also objects, and from there observe how references and pointers to instances and members are also objects; However, this is exactly the type of explanation that overwhelms us with detail to the point where it obscures the basics! At this point, we have a typical example for 4 different manifestations of lvalues. The spec doesn’t dictate any restrictions about it only belonging on the left-hand side or the right-hand side of an assignment operator! An lvalue is an expression that ultimately locates the object in memory.
Hence the much more appropriate description of lvalue as a “locator-value”.
At this point, we must admit that we snuck in an lvalue in an initialization expression: lv1 is not just an lvalue in the statement where it is declared! Even when lv1 is used to initialize the lv2 reference (a reference shall be initialized, always), lv1 is still an lvalue!
The best way to illustrate the use of an lvalue, is to use it as a locator for result storage, as well as a locator of data input; Go ahead and look at them in action:
C++
// CPP program to illustrate the concept of lvalue
#include <iostream>
using namespace std;
// §3.10.1
// An lvalue designates a function or an object
// An lvalue is an expression whose
// address can be taken:
// essentially a locator value
int lv1{ 42 }; // Object
int& lv2{ lv1 }; // Reveference to Object
int* lv3{ &lv1 }; // Pointer to Object
int& lv4()
{
// Function returning Lvalue Reference
return lv1;
}
int main()
{
// Examine the lvalue expressions
cout << lv1 << "\tObject" << endl;
cout << lv2 << "\tReference" << endl;
cout << lv3 << "\tPointer (object)" << endl;
cout << *lv3 << "\tPointer (value=locator)" << endl;
cout << lv4() << "\tFunction provided reference" << endl;
// Use the lvalue as the target
// of an assignment expression
lv1 = 10;
cout << lv4() << "\tAssignment to object locator" << endl;
lv2 = 20;
cout << lv4() << "\tAssignment to reference locator" << endl;
*lv3 = 30;
cout << lv4() << "\tAssignment to pointer locator" << endl;
// Use the lvalue on the right hand side
// of an assignment expression
// Note that according to the specification,
// those lvalues will first
// be converted to prvalues! But
// in the expression below, they are
// still lvalues...
lv4() = lv1 + lv2 + *lv3;
cout << lv1 << "\tAssignment to reference locator (from function)\n"
"\t\tresult obtained from lvalues to the right of\n"
"\t\tassignment operator"
<< endl;
return 0;
}
Output: 42 Object
42 Reference
0x602070 Pointer (object)
42 Pointer (value=locator)
42 Function provided reference
10 Assignment to object locator
20 Assignment to reference locator
30 Assignment to pointer locator
90 Assignment to reference locator (from function)
result obtained from lvalues to the right of
assignment operator
Prvalue
We are skipping the more complicated rvalue for now. In the aforementioned dark ages, they were trivial. Now they include the mysterious sounding xvalues! We want to ignore those xvalues , which is exactly what the definition of a prvalue lets us do:
A prvalue is an rvalue that is not an xvalue.
Or with a bit less obfuscation:
A prvalue represents a direct value.
This is most obvious in an initializer:
int prv1 {42}; // Value
However, another option is to use an lvalue to initialize:
constexpr int lv1 {42};
int prv2 {lv1}; // Lvalue
What is happening here! This was supposed to be simple, how can an lvalue be a prvalue??? In the specification, §3.10.2 has a sentence that comes to the rescue:
Whenever a glvalue appears in a context where a prvalue is expected, the glvalue is converted to a prvalue.
Let’s ignore the fact that a glvalue is nothing else than an lvalue or an xvalue. We have already banned xvalues from this explanation. Hence: how do we get a value (prvalue) from the lvalue rv2? By converting (evaluating) it!
We can make it even more interesting:
constexpr int f1(int x} {
return 6*x;
}
int prv3 {f1(7)}; // Function return value
We now have a function f1(), that returns a value. The specification indeed provides for situations where a temporary variable (lvalue) gets introduced, which then will get converted to a prvalue where needed. Just pretend that this is happening:
int prv3 {t}; // Temporary variable t created by compiler
// . not declared by user),
// - initialized to value returned
// by f1(7)
A similar interpretation is in place for more complex expressions:
int prv4 {(lv1+f1(7))/2};// Expression: temporary variable
// gets value of (lv1+f1(7))/2
Careful now! The rvalues are NOT the objects, nor the functions. The rvalues are what is ultimately used:
- The value of a literal (not related to any object).
- The value returned by a function (not related to any object, unless we count the temporary object used for the return value).
- The value of a temporary object is required to hold the result of evaluating an expression.
For the people who learn by executing a compiler:
C++
// CPP program to illustrate glvalue
#include <iostream>
using namespace std;
// §3.10.1
// An rvalue is an xvalue, a temporary object (§12.2),
// or a value not associated with an object
// A prvalue is an rvalue that is NOT an xvalue
// When a glvalue appears in a context
// where a prvalue is expected,
// the glvalue is converted to a prvalue
int prv1{ 42 }; // Value
constexpr int lv1{ 42 };
int prv2{ lv1 }; // Expression (lvalue)
constexpr int f1(int x)
{
return 6 * x;
}
int prv3{ f1(7) }; // Expression (function return value)
int prv4{ (lv1 + f1(7)) / 2 }; // Expression (temporary object)
int main()
{
// Print out the prvalues used
// in the initializations
cout << prv1 << " Value" << endl;
cout << prv2 << " Expression: lvalue" << endl;
cout << prv3 << " Expression: function return value" << endl;
cout << prv4 << " Expression: temporary object" << endl;
return 0;
}
Output: 42 Value
42 Expression: lvalue
42 Expression: function return value
42 Expression: temporary object
Xvalue
Wait: we were not going to talk about xvalues?! Well, at this point, we have learned that lvalues and prvalues are really not that hard after all. Pretty much what any reasonable person would expect. We don’t want to be disappointed by reading all this text, only to confirm that lvalues involve a locatable object, and prvalues refer to some actual value. Hence this surprise: we might as well cover xvalues as well, then we’re done and understand all of them!
We need to embark on a bit of a story to get to the point, though…
References
The story starts in §8.5.3 in the specification; We need to understand that the C++ now distinguishes between two different references:
int& // lvalue reference
int&& // rvalue reference
Their functionality is semantically exactly the same. Yet they are different types! That means that the following overloaded functions are different as well:
int f(int&);
int f(int&&);
This would be silly, if it wasn’t for this one sentence in the specification that no normal human beings ever reach, well into §8.5.3:
A reference to type “cv1 T1” is initialized by an expression of type “cv2 T2” as follows:
…
If the reference is an rvalue reference, the initializer expression shall not be an lvalue.
Looking at a simple attempt to bind references to an lvalue:
int lv1 {42};
int& lvr {lv1}; // Allowed
int&& rvr1 {lv1}; // Illegal
int&& rvr2 {static_cast<int&&>(lv1)};// Allowed
This particular behavior can now be exploited for advanced features. If you want to play with it a bit more, here is a jump start:
(manipulate line 33 to enable the illegal statements).
C++
#include <iostream>
using namespace std;
// §8.3.2
// References are either form of:
// T& D lvalue reference
// T&& D rvalue reference
// They are distinct types (differentiating overloaded functions)
// §8.5.3
// The initializer of an rvalue reference shall not be an lvalue
// lvalue references
const int& lvr1{ 42 }; // value
int lv1{ 0 };
int& lvr2{ lv1 }; // lvalue (non-const)
constexpr int lv2{ 42 };
const int& lvr3{ lv2 }; // lvalue (const)
constexpr int f1(int x)
{
return 6 * x;
}
const int& lvr4{ f1(7) }; // Function return value
const int& lvr5{ (lv1 + f1(7)) / 2 }; // expression
// rvalue references
const int&& rvr1{ 42 }; // value
// Enable next two statements to reveal compiler error
#if 0
int&& rvr2 {lv1}; // lvalue (non-const)
const int&& rvr3 {lv2}; // lvalue (const)
#else
int&& rvr2{ static_cast<int&&>(lv1) }; // rvalue (non-const)
const int&& rvr3{ static_cast<const int&&>(lv2) }; // rvalue (const)
#endif
const int&& rvr4{ f1(7) }; // Function return value
const int&& rvr5{ (lv1 + f1(7)) / 2 }; // expression
int main()
{
lv1 = 42;
// Print out the references
cout << lvr1 << " Value" << endl;
cout << lvr2 << " lvalue (non-const)" << endl;
cout << lvr3 << " lvalue (const)" << endl;
cout << lvr4 << " Function return value" << endl;
cout << lvr5 << " Expression (temporary object)" << endl;
cout << rvr1 << " Value" << endl;
cout << rvr2 << " rvalue (const)" << endl;
cout << rvr3 << " rvalue (non-const)" << endl;
cout << rvr4 << " Function return value" << endl;
cout << rvr5 << " Expression (temporary object)" << endl;
return 0;
}
Output: 42 Value
42 lvalue (non-const)
42 lvalue (const)
42 Function return value
21 Expression (temporary object)
42 Value
42 rvalue (const)
42 rvalue (non-const)
42 Function return value
21 Expression (temporary object)
Move Semantics
The next part of the story needs to be translated from §12.8 in the specification. Rather than copying objects, it might be faster (especially for large objects) if object resources can be “moved”. This is relevant in two different situations:
- Initialization (including argument passing and value return).
- Assignment.
These situations rely on special member functions to get the job done:
struct S {
S(T t) : _t(t) {} // Constructor
S(const S &s); // Copy Constructor
S& operator=(const S &s); // Copy Assignment Operator
T* _t;
};
T t1;
S s1 {t1}; // Constructor with initialization
S s2 {s1}; // Constructor with copy
S s3; // Constructor with defaults
s3 = s2; // Copy assignment operator
How innocent does that pointer to T look in the declaration of struct S! However, for large, complex types T, the management for the content of the member _t can involve deep copies and really smack down the performance. Every time an instance of struct S goes through the parameters of a function, some expressions, and then potentially a return from a function: we’re spending more time copying data, than effectively working with it!
We can define some alternative special functions to deal with this. These functions can be written in such a way that rather than copying information, we just steal it from other objects. Only we don’t call it stealing, it involves a much more legal terminology: moving it. The functions take advantage of the different types of references:
S(const S &&s); // Move Constructor
S& operator=( S &&s); // Move Assignment Operator
Note that we’re keeping the original constructor and operator for when the actual parameter is an lvalue.
However, if we only could force the actual parameter to be an rvalue, then we can execute this new constructor or assignment operator! There actually are a few ways of turning the lvalue into an rvalue; A trivial way is to static_cast the lvalue to the appropriate type:
S s4 {static_cast<S&&>(s3)); // Calls move constructor
s2 = static_cast<S&&>(s4); // Calls move assignment operator
The same can be achieved in a bit more comprehensive way, by indicating that the parameter “can be used to move data”:
S s4 {std::move(s3)); // Calls move constructor
S2 = std::move(s4); // Calls move assignment operator
The best insight is always to see it in action:
C++
#include <iostream>
using namespace std;
// §12
// Special member functions
// . §12.1 Constructor
// . §12.8 Copy/Move
// - §12/1 Copy/Move Constructor
// - §13.5.3 Copy/Move Assignment Operator
struct T {
int _v1;
int _v2;
int _v3;
friend std::ostream& operator<<(std::ostream& os, const T& p)
{
return os << "[ " << p._v1 << " | " << p._v2 << " | " << p._v3 << " ]";
}
};
struct S {
S() // Constructor
{
cout << "Constructing instance of S" << endl;
_t = new T{ 1, 2, 3 };
}
S(T& t) // Constructor
{
cout << "Initializing instance of S" << endl;
_t = new T{ t };
}
S(const S& that) // Copy Constructor
{
cout << "Copying instance of S" << endl;
_t = new T;
*_t = *(that._t); // Deep copy
}
S& operator=(const S& that) // Copy Assignment Operator
{
cout << "Assigning instance of S" << endl;
*_t = *(that._t); // Deep copy
return *this;
}
S(S&& that) // Move Constructor
{
cout << "Moving instance of S" << endl;
_t = that._t; // Move resources
that._t = nullptr; // Reset source (protect)
}
S& operator=(S&& that) // Move Assignment Operator
{
cout << "Move-assigning instance of S" << endl;
_t = that._t; // Move resources
that._t = nullptr; // Reset source (protect)
return *this;
}
T* _t;
};
int main()
{
T t1{ 41, 42, 43 };
cout << t1 << " Initializer" << endl;
S s1{ t1 };
cout << s1._t << " : " << *(s1._t) << " Initialized" << endl;
S s2{ s1 };
cout << s2._t << " : " << *(s2._t) << " Copy Constructed" << endl;
S s3;
cout << s3._t << " : " << *(s3._t) << " Default Constructed" << endl;
s3 = s2;
cout << s3._t << " : " << *(s3._t) << " Copy Assigned" << endl;
S s4{ static_cast<S&&>(s3) };
cout << s4._t << " : " << *(s4._t) << " Move Constructed" << endl;
s2 = std::move(s4);
cout << s2._t << " : " << *(s2._t) << " Move Assigned" << endl;
return 0;
}
Output: [ 41 | 42 | 43 ] Initializer
Initializing instance of S
0x1d13c30 : [ 41 | 42 | 43 ] Initialized
Copying instance of S
0x1d13c50 : [ 41 | 42 | 43 ] Copy Constructed
Constructing instance of S
0x1d13c70 : [ 1 | 2 | 3 ] Default Constructed
Assigning instance of S
0x1d13c70 : [ 41 | 42 | 43 ] Copy Assigned
Moving instance of S
0x1d13c70 : [ 41 | 42 | 43 ] Move Constructed
Move-assigning instance of S
0x1d13c70 : [ 41 | 42 | 43 ] Move Assigned
Xvalues
We have reached the end of our story:
xvalues are also known as eXpiring values.
Lets have a look at the move semantics of the example above:
S(S &&that) // Move Constructor
{
cout << "Moving instance of S" << endl;
_t = that._t; // Move resources
that._t = nullptr; // Reset source (protect)
}
S& operator=(S &&that) // Move Assignment Operator
{
cout << "Move-assigning instance of S" << endl;
_t = that._t; // Move resources
that._t = nullptr; // Reset source (protect)
return *this;
}
We have achieved the goal of performance by moving the resources from the parameter object, into the current object. But note that we’re also invalidating the current object right after that. This is because we don’t want to accidentally manipulate the actual parameter object: any change there would ripple through to our current object, and that is not quite the encapsulation we’re after with object-oriented programming.
The specification gives a few possibilities for an expression to be an xvalue, but let’s just remember this one:
- A cast to an rvalue reference to an object…
Summary
Lvalues (Locator values) | Designates an object, a location in memory |
Prvalues (Pure rvalues) | Represents an actual value |
Xvalues (eXpiring values | An object towards the end of its’ lifetime (typically used in move semantics) |
Similar Reads
C++ Programming Language C++ is a computer programming language developed by Bjarne Stroustrup as an extension of the C language. It is known for is fast speed, low level memory management and is often taught as first programming language. It provides:Hands-on application of different programming concepts.Similar syntax to
5 min read
C++ Overview
Introduction to C++ Programming LanguageC++ is a general-purpose programming language that was developed by Bjarne Stroustrup as an enhancement of the C language to add object-oriented paradigm. It is considered as a middle-level language as it combines features of both high-level and low-level languages. It has high level language featur
3 min read
Features of C++C++ is a general-purpose programming language that was developed as an enhancement of the C language to include an object-oriented paradigm. It is an imperative and compiled language. C++ has a number of features, including:Object-Oriented ProgrammingMachine IndependentSimpleHigh-Level LanguagePopul
5 min read
History of C++The C++ language is an object-oriented programming language & is a combination of both low-level & high-level language - a Middle-Level Language. The programming language was created, designed & developed by a Danish Computer Scientist - Bjarne Stroustrup at Bell Telephone Laboratories (
7 min read
Interesting Facts about C++C++ is a general-purpose, object-oriented programming language. It supports generic programming and low-level memory manipulation. Bjarne Stroustrup (Bell Labs) in 1979, introduced the C-With-Classes, and in 1983 with the C++. Here are some awesome facts about C++ that may interest you: The name of
2 min read
Setting up C++ Development EnvironmentC++ runs on lots of platforms like Windows, Linux, Unix, Mac, etc. If you do not want to set up a local environment you can also use online IDEs for compiling your program.Using Online IDEIDE stands for an integrated development environment. IDE is a software application that provides facilities to
8 min read
Difference between C and C++C++ is often viewed as a superset of C. C++ is also known as a "C with class" This was very nearly true when C++ was originally created, but the two languages have evolved over time with C picking up a number of features that either weren't found in the contemporary version of C++ or still haven't m
3 min read
C++ Basics
Understanding First C++ ProgramThe "Hello World" program is the first step towards learning any programming language and is also one of the most straightforward programs you will learn. It is the basic program that demonstrates the working of the coding process. All you have to do is display the message "Hello World" on the outpu
4 min read
C++ Basic SyntaxSyntax refers to the rules and regulations for writing statements in a programming language. They can also be viewed as the grammatical rules defining the structure of a programming language.The C++ language also has its syntax for the functionalities it provides. Different statements have different
4 min read
C++ CommentsComments in C++ are meant to explain the code as well as to make it more readable. Their purpose is to provide information about code lines. When testing alternative code, they can also be used to prevent execution of some part of the code. Programmers commonly use comments to document their work.Ex
3 min read
Tokens in CIn C programming, tokens are the smallest units in a program that have meaningful representations. Tokens are the building blocks of a C program, and they are recognized by the C compiler to form valid expressions and statements. Tokens can be classified into various categories, each with specific r
4 min read
C++ KeywordsKeywords are the reserved words that have special meanings in the C++ language. They are the words that have special meaning in the language. C++ uses keywords for a specifying the components of the language, such as void, int, public, etc. They can't be used for a variable name, function name or an
2 min read
Difference between Keyword and Identifier in CIn C, keywords and identifiers are basically the fundamental parts of the language used. Identifiers are the names that can be given to a variable, function or other entity while keywords are the reserved words that have predefined meaning in the language.The below table illustrates the primary diff
3 min read
C++ Variables and Constants
C++ VariablesIn C++, variable is a name given to a memory location. It is the basic unit of storage in a program. The value stored in a variable can be accessed or changed during program execution.Creating a VariableCreating a variable and giving it a name is called variable definition (sometimes called variable
4 min read
Constants in CIn C programming, const is a keyword used to declare a variable as constant, meaning its value cannot be changed after it is initialized. It is mainly used to protect variables from being accidentally modified, making the program safer and easier to understand. These constants can be of various type
4 min read
Scope of Variables in C++In C++, the scope of a variable is the extent in the code upto which the variable can be accessed or worked with. It is the region of the program where the variable is accessible using the name it was declared with.Let's take a look at an example:C++#include <iostream> using namespace std; //
7 min read
Storage Classes in C++ with ExamplesC++ Storage Classes are used to describe the characteristics of a variable/function. It determines the lifetime, visibility, default value, and storage location which helps us to trace the existence of a particular variable during the runtime of a program. Storage class specifiers are used to specif
6 min read
Static Keyword in C++The static keyword in C++ has different meanings when used with different types. In this article, we will learn about the static keyword in C++ along with its various uses.In C++, a static keyword can be used in the following context:Table of ContentStatic Variables in a FunctionStatic Member Variab
5 min read
C++ Data Types and Literals
C++ Data TypesData types specify the type of data that a variable can store. Whenever a variable is defined in C++, the compiler allocates some memory for that variable based on the data type with which it is declared as every data type requires a different amount of memory.C++ supports a wide variety of data typ
7 min read
Literals in CIn C, Literals are the constant values that are assigned to the variables. Literals represent fixed values that cannot be modified. Literals contain memory but they do not have references as variables. Generally, both terms, constants, and literals are used interchangeably. For example, âconst int =
4 min read
Derived Data Types in C++The data types that are derived from the primitive or built-in datatypes are referred to as Derived Data Types. They are generally the data types that are created from the primitive data types and provide some additional functionality.In C++, there are four different derived data types:Table of Cont
4 min read
User Defined Data Types in C++User defined data types are those data types that are defined by the user himself. In C++, these data types allow programmers to extend the basic data types provided and create new types that are more suited to their specific needs. C++ supports 5 user-defined data types:Table of ContentClassStructu
4 min read
Data Type Ranges and Their Macros in C++Most of the times, in competitive programming, there is a need to assign the variable, the maximum or minimum value that data type can hold but remembering such a large and precise number comes out to be a difficult job. Therefore, C++ has certain macros to represent these numbers, so that these can
3 min read
C++ Type ModifiersIn C++, type modifiers are the keywords used to change or give extra meaning to already existing data types. It is added to primitive data types as a prefix to modify their size or range of data they can store.C++ have 4 type modifiers which are as follows:Table of Contentsigned Modifierunsigned Mod
4 min read
Type Conversion in C++Type conversion means converting one type of data to another compatible type such that it doesn't lose its meaning. It is essential for managing different data types in C++. Let's take a look at an example:C++#include <iostream> using namespace std; int main() { // Two variables of different t
4 min read
Casting Operators in C++The casting operators is the modern C++ solution for converting one type of data safely to another type. This process is called typecasting where the type of the data is changed to another type either implicitly (by the compiler) or explicitly (by the programmer).Let's take a look at an example:C++#
5 min read
C++ Operators
Operators in C++C++ operators are the symbols that operate on values to perform specific mathematical or logical computations on given values. They are the foundation of any programming language.Example:C++#include <iostream> using namespace std; int main() { int a = 10 + 20; cout << a; return 0; }Outpu
9 min read
C++ Arithmetic OperatorsArithmetic Operators in C++ are used to perform arithmetic or mathematical operations on the operands (generally numeric values). An operand can be a variable or a value. For example, â+â is used for addition, '-' is used for subtraction, '*' is used for multiplication, etc. Let's take a look at an
4 min read
Unary Operators in CIn C programming, unary operators are operators that operate on a single operand. These operators are used to perform operations such as negation, incrementing or decrementing a variable, or checking the size of a variable. They provide a way to modify or manipulate the value of a single variable in
5 min read
Bitwise Operators in CIn C, bitwise operators are used to perform operations directly on the binary representations of numbers. These operators work by manipulating individual bits (0s and 1s) in a number.The following 6 operators are bitwise operators (also known as bit operators as they work at the bit-level). They are
6 min read
Assignment Operators in CIn C, assignment operators are used to assign values to variables. The left operand is the variable and the right operand is the value being assigned. The value on the right must match the data type of the variable otherwise, the compiler will raise an error.Let's take a look at an example:C#include
4 min read
C++ sizeof OperatorThe sizeof operator is a unary compile-time operator used to determine the size of variables, data types, and constants in bytes at compile time. It can also determine the size of classes, structures, and unions.Let's take a look at an example:C++#include <iostream> using namespace std; int ma
3 min read
Scope Resolution Operator in C++In C++, the scope resolution operator (::) is used to access the identifiers such as variable names and function names defined inside some other scope in the current scope. Let's take a look at an example:C++#include <iostream> int main() { // Accessing cout from std namespace using scope // r
4 min read
C++ Input/Output
C++ Control Statements
Decision Making in C (if , if..else, Nested if, if-else-if )In C, programs can choose which part of the code to execute based on some condition. This ability is called decision making and the statements used for it are called conditional statements. These statements evaluate one or more conditions and make the decision whether to execute a block of code or n
7 min read
C++ if StatementThe C++ if statement is the most simple decision-making statement. It is used to decide whether a certain statement or block of statements will be executed or not executed based on a certain condition. Let's take a look at an example:C++#include <iostream> using namespace std; int main() { int
3 min read
C++ if else StatementThe if statement alone tells us that if a condition is true it will execute a block of statements and if the condition is false, it wonât. But what if we want to do something else if the condition is false. Here comes the C++ if else statement. We can use the else statement with if statement to exec
3 min read
C++ if else if LadderIn C++, the if-else-if ladder helps the user decide from among multiple options. The C++ if statements are executed from the top down. As soon as one of the conditions controlling the if is true, the statement associated with that if is executed, and the rest of the C++ else-if ladder is bypassed. I
3 min read
Switch Statement in C++In C++, the switch statement is a flow control statement that is used to execute the different blocks of statements based on the value of the given expression. It is a simpler alternative to the long if-else-if ladder.SyntaxC++switch (expression) { case value_1: // code to be executed. break; case v
5 min read
Jump statements in C++Jump statements are used to manipulate the flow of the program if some conditions are met. It is used to terminate or continue the loop inside a program or to stop the execution of a function.In C++, there is four jump statement:Table of Contentcontinue Statementbreak Statementreturn Statementgoto S
4 min read
C++ LoopsIn C++ programming, sometimes there is a need to perform some operation more than once or (say) n number of times. For example, suppose we want to print "Hello World" 5 times. Manually, we have to write cout for the C++ statement 5 times as shown.C++#include <iostream> using namespace std; int
7 min read
for Loop in C++In C++, for loop is an entry-controlled loop that is used to execute a block of code repeatedly for the given number of times. It is generally preferred over while and do-while loops in case the number of iterations is known beforehand.Let's take a look at an example:C++#include <bits/stdc++.h
6 min read
Range-Based for Loop in C++In C++, the range-based for loop introduced in C++ 11 is a version of for loop that is able to iterate over a range. This range can be anything that is iteratable, such as arrays, strings and STL containers. It provides a more readable and concise syntax compared to traditional for loops.Let's take
3 min read
C++ While LoopIn C++, the while loop is an entry-controlled loop that repeatedly executes a block of code as long as the given condition remains true. Unlike the for loop, while loop is used in situations where we do not know the exact number of iterations of the loop beforehand as the loop execution is terminate
3 min read
C++ do while LoopIn C++, the do-while loop is an exit-controlled loop that repeatedly executes a block of code at least once and continues executing as long as a given condition remains true. Unlike the while loop, the do-while loop guarantees that the loop body will execute at least once, regardless of whether the
4 min read
C++ Functions
Functions in C++A Function is a reusable block of code designed to perform a specific task. It helps break large programs into smaller, logical parts. Functions make code cleaner, easier to understand, and more maintainable.Just like in other languages, C++ functions can take inputs (called parameters), execute a b
8 min read
return Statement in C++In C++, the return statement returns the flow of the execution to the function from where it is called. This statement does not mandatorily need any conditional statements. As soon as the statement is executed, the flow of the program stops immediately and returns the control from where it was calle
4 min read
Parameter Passing Techniques in CIn C, passing values to a function means providing data to the function when it is called so that the function can use or manipulate that data. Here:Formal Parameters: Variables used in parameter list in a function declaration/definition as placeholders. Also called only parameters.Actual Parameters
3 min read
Difference Between Call by Value and Call by Reference in CFunctions can be invoked in two ways: Call by Value or Call by Reference. These two ways are generally differentiated by the type of values passed to them as parameters.The following table lists the differences between the call-by-value and call-by-reference methods of parameter passing.Call By Valu
4 min read
Default Arguments in C++A default argument is a value provided for a parameter in a function declaration that is automatically assigned by the compiler if no value is provided for those parameters in function call. If the value is passed for it, the default value is overwritten by the passed value.Example:C++#include <i
5 min read
Inline Functions in C++In C++, inline functions provide a way to optimize the performance of the program by reducing the overhead related to a function call. When a function is specified as inline the whole code of the inline function is inserted or substituted at the point of its call during the compilation instead of us
6 min read
Lambda Expression in C++C++ 11 introduced lambda expressions to allow inline functions which can be used for short snippets of code that are not going to be reused. Therefore, they do not require a name. They are mostly used in STL algorithms as callback functions.Example:C++#include <iostream> using namespace std; i
4 min read
C++ Pointers and References
Pointers and References in C++In C++ pointers and references both are mechanisms used to deal with memory, memory address, and data in a program. Pointers are used to store the memory address of another variable whereas references are used to create an alias for an already existing variable. Pointers in C++ Pointers in C++ are a
5 min read
C++ PointersA pointer is a special variable that holds the memory address of another variable, rather than storing a direct value itself. Pointers allow programs to access and manipulate data in memory efficiently, making them a key feature for system-level programming and dynamic memory management. When we acc
8 min read
Dangling, Void , Null and Wild Pointers in CIn C programming pointers are used to manipulate memory addresses, to store the address of some variable or memory location. But certain situations and characteristics related to pointers become challenging in terms of memory safety and program behavior these include Dangling (when pointing to deall
6 min read
Applications of Pointers in CPointers in C are variables that are used to store the memory address of another variable. Pointers allow us to efficiently manage the memory and hence optimize our program. In this article, we will discuss some of the major applications of pointers in C. Prerequisite: Pointers in C. C Pointers Appl
4 min read
Understanding nullptr in C++Consider the following C++ program that shows problem with NULL (need of nullptr) CPP // C++ program to demonstrate problem with NULL #include <bits/stdc++.h> using namespace std; // function with integer argument void fun(int N) { cout << "fun(int)"; return;} // Overloaded fun
3 min read
References in C++In C++, a reference works as an alias for an existing variable, providing an alternative name for it and allowing you to work with the original data directly.Example:C++#include <iostream> using namespace std; int main() { int x = 10; // ref is a reference to x. int& ref = x; // printing v
5 min read
Can References Refer to Invalid Location in C++?Reference Variables: You can create a second name for a variable in C++, which you can use to read or edit the original data contained in that variable. While this may not sound appealing at first, declaring a reference and assigning it a variable allows you to treat the reference as if it were the
2 min read
Pointers vs References in C++Prerequisite: Pointers, References C and C++ support pointers, which is different from most other programming languages such as Java, Python, Ruby, Perl and PHP as they only support references. But interestingly, C++, along with pointers, also supports references. On the surface, both references and
5 min read
Passing By Pointer vs Passing By Reference in C++In C++, we can pass parameters to a function either by pointers or by reference. In both cases, we get the same result. So, what is the difference between Passing by Pointer and Passing by Reference in C++?Let's first understand what Passing by Pointer and Passing by Reference in C++ mean:Passing by
5 min read
When do we pass arguments by pointer?In C, the pass-by pointer method allows users to pass the address of an argument to the function instead of the actual value. This allows programmers to change the actual data from the function and also improve the performance of the program. In C, variables are passed by pointer in the following ca
5 min read