gpt4 book ai didi

C++ 到 C 代码的转换,是否等价?

转载 作者:行者123 更新时间:2023-11-30 17:28:47 24 4
gpt4 key购买 nike

我必须将 C++ 程序转换为 C,这已经完成了。问题是所提供的代码是否等效以及我是否错过了任何内容。

提供的两个代码都是完整的并且应该可以编译。两者在运行时也给出相同的答案。但我是 C++ 新手,我不知道我是否在转换中遗漏了一些可能很重要的内容。

还有一个问题,在 C++ 代码中,int x 和 int y 被声明为全局的,我没有,也不认为我需要任何类似的东西,但我真的不知道它们是什么正在做。指导?

C++

#include <iostream>

// a point on the integer grid

struct Point
{
// constructor
Point()
{
x = y = 0;
}

// add point componentwise
void add(const Point &p)
{
x += p.x;
y += p.y;
}

// print to standard output
void print() const
{
std::cout << "[" << x << "," << y << "]" << std::endl;
}

// data
int x, y;
};

int main()
{
const int N = 200;
Point *A = new Point[N], sum;

for (int i=0; i < N; ++i) {
sum.print();
A[i].x = i; A[i].y = -i;
sum.add(A[i]);
}
sum.print();

delete [] A;
}

C

#include <stdio.h>
#include <stdlib.h>

typedef struct //constructor
{
int x;
int y;
} Point;

void add(const Point * p, Point * sum)
{
(*sum).x += (*p).x;
(*sum).y += (*p).y;

}

void print(const int x, const int y)
{
printf("[%d,%d]\n", x, y);
}

int main()
{
int i = 0;

const int N = 200;


Point *A = malloc(N*sizeof(Point)), sum;
if(!A)
{
printf(stderr, "malloc() failed to allocate memory!");
abort();
}

sum.x =0;
sum.y = 0;

for (i = 0; i <N; i++)
{
print (sum.x, sum.y);
A[i].x = i; A[i].y = -i;
add(&A[i], &sum);
}
print(sum.x, sum.y);

free(A);
return 0;
}

最佳答案

它在功能上相当等效(除了构造函数问题,见下文)。但由于某种原因,它包含许多不一致和“不合逻辑”的风格决定。

  • 通过 C 函数近似 C++ 方法的“标准”方法是通过显式参数实现 C++ 隐式 this 参数。这将使您的 add 函数如下所示

    void add(Point *this, const Point *p)
    {
    this->x += p->x;
    this->y += p->y;
    }

    请注意,在 C++ 版本中,您还可以在左侧使用 this->x 语法(而不仅仅是 x),这只会强调相似。显然,我上面的版本与你的相同,但以我认为更“传统”的方式排列。

  • 您忘记在 C 版本代码中为您的 Point 定义“构造函数”。在 C++ 代码中,您的 Point 对象在其生命周期开始时初始化为零。在 C 代码中,这些对象以 xy 中的垃圾开始它们的生命。稍后,您为 xy 分配明确的值,这使得非初始化问题变得无关紧要,但它仍然存在。

    当然,如果您决定实现“构造函数”函数,则必须为每个数组元素手动调用它,而在 C++ 中它会自动为您调用。

  • 出于某种原因,您决定将对象“分解”为 print 函数的 xy 参数。为什么?同样,具有显式 this 参数的相同方法可用于 print,如下所示

    void print(const Point *this)
    {
    printf("[%d,%d]\n", this->x, this->y);
    }

    在您当前的版本中

    void print(const int x, const int y)
    应用于参数的 const 限定符实际上没有任何用处,并且不会提升与 C++ 版本的等效性(即,这些 const 限定符不等同于尾随的 const 在 C++ 版本中)。

    但是,无论如何,这些纯粹是风格建议。

  • 另请注意,在 C++ 语言中

    const int N = 200;

    定义一个常量,而在C语言中它不定义常量。在 C 中,它本质上定义了“不可修改的变量”。但这对于您的代码来说完全无关紧要,因为您的代码并不关心 N 是否是常量。 (我不知道你是否关心这种迂腐的对等。)

关于C++ 到 C 代码的转换,是否等价?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25943452/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com