kamikaze_pilot
kamikaze_pilot

Reputation: 14834

correct me if my understanding of c++ is wrong

correct me if any of my following current understanding of c++ is wrong:

  1. C++ is an extended version of C. Therefore, C++ is just as efficient as C.
  2. Moreover, any application written in C can be compiled using C++ compilers
  3. C syntax is also valid C++ syntax
  4. C++ is at the exact same language level hierarchy as C.

Language Level Hierarchy

eg. lowest-level: assembly language, high-levels: Java, PHP, etc

so my interpretation is that

C++/C is at a lower level than Java,PHP etc since it's closer to hardware level (and therefore because of this,it's more efficient than Java, PHP, etc), yet it is not as extreme as assembly language....but C++/C is at the same level with each other and neither one is closer to hardware level

Upvotes: 1

Views: 357

Answers (9)

Tony Delroy
Tony Delroy

Reputation: 106068

C++ is at the exact same language level hierarchy as C. Language Level Hierarchy eg. lowest-level: assembly language, high-levels: Java, PHP, etc

Programming languages are often categorised from 1st generation (machine code), 2nd generation (assembly language), 3rd generation (imperative languages), 4th generation (definition's a bit vague - domain-specific languages intended for high productivity, e.g. SQL), 5th generation (typical language of the problem expression, e.g. maths notation, logic, or a human language; Miranda, Prolog). See e.g. http://en.wikipedia.org/wiki/Fifth-generation_programming_language and its links.

In that sense, C and C++ are both 3rd generation languages. (As Jerry points out, so are PHP, Java, PERL, Ruby, C#...). Using that yardstick, these languages belong in the same general group... they're all languages in which you have to tell the computer how to solve the problem, but not at a CPU-specific level.

In another sense though, C++ has higher level programming concepts than C, such as Object Orientation, functors, and more polymorphic features including templates and overloading, even though they're all ways to organise and access the steps for solving the problem. Higher level languages (i.e. 5GL) don't need to be told that - rather, they just need a description of the problem and knowing how to solve the entire domain of problems they find a workable approach for your specific case.

C++/C is at a lower level than Java,PHP etc since it's closer to hardware level (and therefore because of this,it's more efficient than Java, PHP, etc), yet it is not as extreme as assembly language....but C++/C is at the same level with each other and neither one is closer to hardware level

This is confusing things a bit. Summarily:

  • C++ and C do span lower than Java/PHP, yes.
  • C++ and C do tend to be more efficient, yes. You can get a general impression of this at http://benchmarksgame.alioth.debian.org/u64q/which-programs-are-fastest.html - don't take it too literally, it depends a lot on your problem space.
  • C++ and C both go as low as each other, but C++ has some higher level programming support too (though it's still a 3GL like C).

Let's look at a few examples:

  • bit shifting: Java is designed to be more portable (sometimes at the expense of performance) than C or C++, so even with JIT certain operations might be a bit inefficient on some platforms, but it may be convenient that they operate predictably. If you're doing equivalent work, and care about the edge cases where CPU behaviours differ, you'll find C and C++ leave operator behaviour for the implementation to specify. You may need to write multiple versions of the code for the different deployment platforms, only to end up getting pretty much the same performance as Java (but programs often know they won't exercise edge cases, or don't care about the behavioural differences). In that respect, Java has abstracted away a low-level concern and could reasonably be considered higher level but pessimistic.

  • C++ provides some higher level facilities such as templates (and hence template metaprogramming), and multiple inheritance. Compilers commonly provide low level facilities such as inline assembly and the ability to call arbitrary functions from other objects/libraries as long as the function signatures are known at compile time (some libraries work around this limitation). Interpreted (e.g. PHP) and Virtual Machine based (e.g. Java) languages tend to be worse at this.

  • Java also provides some higher level facilities that C++ lacks - e.g. introspection, serialisation.

Generally, I tend to conceive of C++ spanning both lower and higher than Java. Put another way, Java overlaps a section in the middle of C++'s span. But, Java has a few stand-out high-level features too.

PHP is an interpreted language that again abstracts away some low level concerns, but generally fails to provide good facilities for more abstract or robust programming techniques too. Like most interpreters, it does allow run-time evaluation of arbitrary source code, as well as run-time modification of class metadata etc., which allows a high level, powerful but dangerously unstructured approach to programming. That kind of thing isn't possible in a compiled language unless the compiler is shipped in the deployment environment (and even then there are more limitations).

C++ is an extended version of C. Therefore, C++ is just as efficient as C.

Generally true.

Moreover, any application written in C can be compiled using C++ compilers C syntax is also valid C++ syntax

There are some trivial differences, e.g.:

  • in C++, main() must have return type int and implicitly returns 0 on exit if not return statement's encountered, but C allows void or int and for the latter must explicitly return an int
  • C++ has additional keywords (e.g. mutable, virtual, class, explicit...) that are therefore not legal C++ identifiers, but are legal in C

Still, your conception is essentially true.

Upvotes: 2

R.. GitHub STOP HELPING ICE
R.. GitHub STOP HELPING ICE

Reputation: 215193

Summary:

  1. True.
  2. Dangerously false.
  3. False.
  4. Subjective

Some examples for 2/3:

  • sizeof 'a' is 1 in C++ and sizeof(int) in C.
  • char *s = malloc(len+1); is correct C but invalid C++.
  • char s[2*strlen(name)+1]; is valid (albeit dangerous) C, but invalid C++.
  • sizeof (1?"hello":"goodbye") issizeof(char *)` in C but 6 in C++.

Attempting to compile existing C code as C++ is simply invalid and likely to produce dangerous bugs even if you hunt down and "fix" all the compile-time errors. And writing code that's valid in both languages is perhaps a reasonable entry for a polyglot competition, but not for any serious use. The intersection of C and C++ is actually a very ugly language that's the worst of both worlds.

Upvotes: 1

Eric Z
Eric Z

Reputation: 14505

That's a whole big question to answer.

  1. Not in all cases!
  2. not true because of 3
  3. not true
  4. They are not exactly the same

I don't think language level hierarchy matters too much for a thing. For example, C is a high-level one compared to assembly language while it's a low-level one compared with Java/C#.

Upvotes: 0

Jerry Coffin
Jerry Coffin

Reputation: 490018

  1. If you start with code that's legal as both C and C++, it will typically compile to the same result with both, or close enough that efficiency is only minimally affected.

  2. It's possible to write C that isn't allowable as C++ (e.g., using a variable with a name that's the same as one of the key words added in C++, such as new). Most such cases, however, are trivial to convert so they're allowed in C++. Probably the most difficult case to convert is code that uses function declarations instead of prototypes (or uses functions without declarations at all, which was allowed in older versions of C).

  3. See 2 -- some syntactical C won't work as C++. As noted, it's usually trivial to convert though.

  4. No, not really. Although C++ does provide the same low-level operations as C, it also has higher-level operations that C lacks.

Upvotes: 6

Dmytro
Dmytro

Reputation: 540

  1. C language is not a subset of C++ lanaguage. Check the C99 spec for example - it will not compile in C++ compiler easily. However most of C89 source code can be copied&paste to C++ source code. C and C++ are languages that can be implemented with "zero overhead" comparing to bare iron.

  2. No. But most of C++ compilers are C compilers too. It means that you can compile .C and .C++ files using the same toolchain.

  3. No, The evolution of these languages differs. See answer to question 1.

  4. C++ is multiparadigm language. Yes, it can be used in the same way as C. But it can be used as DSL too - it provides greater abstraction level.

Upvotes: 0

evnu
evnu

Reputation: 6680

Moreover, any application written in C can be compiled using C++ compilers

Not every C program can be compiled using a C++ compiler. There are some differences between C and C++ (keywords, for example), that prevent mixing C and C++ in some ways. Stroustrup adresses some important points in C and C++: Siblings.

C++ is an extended version of C. Therefore, C++ is just as efficient as C.

That depends on the language features you use. I heard that using OOP might bring more cache misses than using a more C-like approach. I can't tell wether this is true or not, as I didn't read more on that subject. But it might be something which should be considered. This is only one example were performance isn't easy comparable.

Upvotes: 2

karthik
karthik

Reputation: 17832

Your understanding is wrong in some of your points:

1) your first point is right.C++ is an extension of c.

2) second point is right . C can be compiled using c++ compilers.

3) Some of C syntax varies from c++. In c++, using structure , c should specify structure name but c++ it is not mandatory to specify structure name.Also C++ have the concept of class that is not available in c. C++ also have higher security mechanisms.

4)C is procedural language but c++ is object oriented approach. so c++ is not at the exact same language level hierarchy as c.

Upvotes: 0

Arelius
Arelius

Reputation: 1216

  1. This isn't exactly true, beyond extra C++ language features that are slower, there are different optimizations that can be done that will change this. Due to the better C++ type system, these are actually normally in C++'s favor however.

  2. No, a big case is that C++ doesn't support automatic cast from void* so for instance

    char* c = malloc(10); // Is valid C, but not C++

    char* c = (char*)malloc(10) //Is required in C++

  3. Except for C99 and newer C features, I think this is nearly always the case. Keep in mind this is only taking into account syntax this doesn't mean that everything that can compile in C can also compile in C++.

  4. Could you elaborate on what you mean by this, what do you mean by "language level hierarchy"?

Upvotes: 1

Ateş Göral
Ateş Göral

Reputation: 140032

1/4 and 2/3 seem to be saying very similar things, but:

  1. Yes (Depends on what you mean by "extended", but at a broad level, yes)
  2. Not always
  3. Not always
  4. Yes

Upvotes: 2

Related Questions