## You are here

HomeC++

## Primary tabs

# C++

C++ is a compiled multi-paradigm programming language based on C that supports procedural, object-oriented and generic programming paradigms. It was developed by Bjarne Stroustrup at Bell Labs in 1983, the same year that the ANSI C standard was ratified. Working in tandem, the ANSI and ISO ratified standard C++ in 1998.

The following C++ program takes two integers as inputs and outputs their greatest common divisor using Euclid’s algorithm.

#include <iostream> template<typename T> T gcd(T x, T y) { while ( y != 0 ) { T z = x % y; x = y; y = z; } return x; } int main() { int inputX, inputY; std::cout << "Please enter x: "; std::cin >> inputX; std::cout << "Please enter y: "; std::cin >> inputY; std::cout << "The GCD of " << inputX << " and " << inputY << " is " << gcd(inputX,inputY) << std::endl; return 0; }

This program works pretty much the same as
the corresponding C example.
Instead of C’s standard I/O library, the program uses
C++’s `iostream`

library.
A substantial difference between the two programs
is that the C++ version of `gcd`

function is more general:
not only can it work with integers of type `int`

,
the same code can work^{1}^{1}
Moreover, unlike most other object-oriented languages,
this abtraction imposes absolutely no performance penalty at run-time.
with *any* type that has
division with remainder defined.
The division with remainder corresponds to the operator `%`

in C++.

Note that the algorithm, for integers, may return negative numbers for the greatest common divisor, if an input contains a negative. The algorithm is still correct, however, if the “greatest common divisor” is suitably defined, as in modern abstract algebra, to be unique only up to units in a ring. See [Stepanov] — which is where the present example comes from — for an interesting discussion around this point.

We could define another GCD function with the same name but that took three integers as input and returned the GCD of the trio. Or we could create our own complex integer object and then write a GCD function with the same name that took complex integers as input. Furthermore, we could define the operators so as to enable a programmer to write things like `w = u + v;`

with complex integers rather something like `w.setVal(complexAddition(u, v));`

. The programmer’s imagination is the limit: the addition operator for a set object could be defined to either add up each element in one set to an element in a second set, or to perform a union of the two sets. Even in our simple GCD example, C++’s `iostream`

library has overloaded the bitwise operators to perform concatenation.

# References

- Stepanov
Alexander Stepanov. Foreword to
*STL Tutorial and Reference Guide*: C++ Programming with the Standard Template Library, second ed. Addison-Wesley, 2001.

## Mathematics Subject Classification

68N15*no label found*

- Forums
- Planetary Bugs
- HS/Secondary
- University/Tertiary
- Graduate/Advanced
- Industry/Practice
- Research Topics
- LaTeX help
- Math Comptetitions
- Math History
- Math Humor
- PlanetMath Comments
- PlanetMath System Updates and News
- PlanetMath help
- PlanetMath.ORG
- Strategic Communications Development
- The Math Pub
- Testing messages (ignore)

- Other useful stuff
- Corrections

## Comments

## Thanks for source code display fixes

Thanks to Michael Slone and Steve Cheng for fixing the source code listings in the C and C++ entries. Yesterday I was trying several different things to get the source code to show up and none of it was working. I've been having trouble with the Web lately, I don't know why. Funny thing is, the day before yesterday I got C and C++ programs for GCD to work after just two tries each. The Javascript program took several dozen tries to get it to work, and this after I got C and C++ to work.

Also thanks to Steve Cheng for adding the data type generalization for gcd(x, y) in the C++ example. Of course I had to try compiling it on my computer. The first try had 19 errors (things like calling "cout" not a class object) and I forgot how many warnings, but that was only because I failed to notice that the pound sign had gotten transmogrified into something else along the way. The second try had just 3 errors, so I added some semicolons and lowercased "GCD" in main(). (I read somewhere that in Standard C++ you can omit semicolons for lines right before ending braces, but I can't recall where, but it wouldn't surprise me one bit if Microsoft's compiler wasn't entirely standards-compliant). On the third try, the program compiled successfully and gave all the right results for my customary test pairs, including (42, -21).

For (-21, 42), Steve's GCD program gives -21, which I think is the right answer (I don't have any rigorous mathematical reasoning for that, nor does Mathematica back me up on this: even for (-42, -21), Mathematica gives the answer as (+)21).

## Re: Thanks for source code display fixes

> Also thanks to Steve Cheng for adding the data type

> generalization for gcd(x, y) in the C++ example. Of course I

> had to try compiling it on my computer. The first try had 19

> errors (things like calling "cout" not a class object) and I

> forgot how many warnings, but that was only because I failed

> to notice that the pound sign had gotten transmogrified into

> something else along the way. The second try had just 3

> errors, so I added some semicolons and lowercased "GCD" in

> main().

Sorry about the mistakes in the program. When editing the article, I had copied-and-pasted the code from the wrong window (which had the typos that I fixed in the actual program I compiled with gcc).

I'm also thinking of writing an example of computing the gcd of polynomials to show how polymorphism works in object-oriented languages.

By the way, the code is indented improperly; this doesn't happen if I LaTeX the article on my computer. Anyone know the solution?

// Steve

// Steve

## Re: Thanks for source code display fixes

By the way, the code is indented improperly; this doesn't happen if I LaTeX the article on my computer. Anyone know the solution?

I know of a solution for smallish examples. PrimeFan successfully put a simple example of a while loop in the font sandbox that is indented nicely enough by the use of \flushleft and \quad. But any source code longer than that (like the gcd program) using \quads seems to be doomed to rendering failure.