Where C and C++ Differ

Where C and C++ Differ

转自:http://cprogramming.com/tutorial/c-vs-c++.html

C++ was based on C and retains a great deal of the functionality. C++ does not retain complete source-level compatability with C. There are a few gotchas for C++ programmers trying to write C code, and C programmers trying to compile with a C++ compiler.

Gotchas for a C programmer using C++

Implicit Assignment from void*

You cannot implicitly assign from a void* to any other type. For instance, the following is perfectly valid in C (in fact, it's arguably the preferable way of doing it in C)

int *x = malloc(sizeof(int) * 10);

but it won't compile in C++. (Try it yourself!)

The explanation from Bjarne Stroustrup himself is that this isn't type safe. What this means is that you can have a void* that points to anything at all, and if you then assign the address stored in that void* to another pointer of a different type, there isn't any warning at all about it.

Consider the following:

int an_int;
void *void_pointer = &an_int;
double *double_ptr = void_pointer;
*double_ptr = 5;

When you assign *double_ptr the value 5, it's writing 8 bytes of memory, but the integer variable an_int is only 4 bytes. Forcing a cast from a void pointer makes the programmer pay attention to these things.

Freeing arrays: new[] and delete[]

In C, there's only one major memory allocation function: malloc. You use it to allocate both single elements and arrays:

int *x = malloc( sizeof(int) );
int *x_array = malloc( sizeof(int) * 10 );

and you always release the memory in the same way:

free( x );
free( x_array );

In C++, however, memory allocation for arrays is somewhat different than for single objects; you use the new[] operator, and you must match calls to new[] with calls to delete[] (rather than to delete).

int *x = new int;
int *x_array = new int[10];

delete x;
delete[] x;

The short explanation is that when you have arrays of objects, delete[] with properly call the destructor for each element of the array, whereas delete will not.

You must declare functions before use

Although most good C code will follow this convention, in C++ it is strictly enforced that all functions must be declared before they are used. This code is valid C, but it is not valid C++:

#include <stdio.h>
int main()
{
    foo();
    return 0;
}

int foo()
{
    printf( "Hello world" );
}

Gotcha for a C++ programmer using C

Structs and Enums

You have to include the struct keyword before the name of the struct type to declare a struct: In C++, you could do this

struct a_struct
{
    int x;
};

a_struct struct_instance;

and have a new instance of a_struct called struct_instance. In C, however, we have to include the struct keyword when declaring struct_instance:

struct a_struct struct_instance;

In fact, a similar situation also holds for declaring enums: in C, you must include the keyword enum; in C++, you don't have to. As a side note, most C programmers get around this issue by using typedefs:

typedef struct struct_name
{
    /* variables */
} struct_name_t;

Now you can declare a struct with

struct_name_t struct_name_t_instance;

But there is another gotcha for C++ programmers: you must still use the "struct struct_name" syntax to declare a struct member that is a a pointer to the struct.

typedef struct struct_name
{
    struct struct_name instance;
    struct_name_t instance2; /* invalid!  The typedef isn't defined yet */
} struct_name_t;

C++ has a much larger library

C++ has a much larger library than C, and some things may be automatically linked in by C++ when they are not with C. For instance, if you're used to using g++ for math-heavy computations, then it may come as a shock that when you are using gcc to compile C, you need to explicitly include the math library for things like sin or even sqrt:

% g++ foo.cc

or

% gcc foo.c -lm

No Boolean Type

C does not provide a native boolean type. You can simulate it using an enum, though:

typedef enum {FALSE, TRUE} bool;

main Doesn't Provide return 0 Automatically

In C++, you are free to leave off the statement 'return 0;' at the end of main; it will be provided automatically:

int main()
{
    print( "Hello, World" );
}

but in C, you must manually add it:

int main()
{
    print( "Hello, World" );
    return 0;
}

-----

 
### Gray Code Implementation in C++ Gray codes are binary numeral systems where two successive values differ by only one bit. This property makes them useful in various applications such as error correction, digital communications, and rotary encoders. A common method to generate a sequence of n-bit Gray codes is through the use of bitwise operations. Below is an example implementation in C++ that generates all possible n-bit Gray codes: ```cpp #include <iostream> #include <vector> std::vector<int> generateGrayCode(int n) { std::vector<int> grayCodes; for (int i = 0; i < (1 << n); ++i) { grayCodes.push_back(i ^ (i >> 1)); // XOR operation between &#39;i&#39; and its half. } return grayCodes; } void printGrayCode(const std::vector<int>& grayCodes) { for (const auto& code : grayCodes) { std::cout << code << " "; } std::cout << "\n"; } int main() { int n = 4; // Number of bits std::vector<int> grayCodes = generateGrayCode(n); printGrayCode(grayCodes); return 0; } ``` The above program uses the formula `G[i] = i ^ (i / 2)`[^3], which converts any integer into its corresponding Gray code representation using simple bitwise operators. The loop iterates over all integers from 0 up to \(2^n - 1\), applying this transformation each time. Additionally, it&#39;s worth noting that while LSD algorithms focus on detecting straight lines within images based on gradient information[^1], they do not directly relate to generating or manipulating Gray codes but share similar principles regarding efficient computation techniques applied differently depending upon specific problem domains like image analysis versus numerical encoding schemes mentioned here.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值