2

在激活 -Wall 的情况下编译我的 C 代码后,出现以下警告

left operand of comma operator has no effect

这与我的return陈述中提出的多个论点有关。故事如下:假设有一堆动态分配的 3D 数组(A、B 和 C)并且想要对它们进行一些操作。数组被定义为指向指针的指针,并使用 malloc(标准过程)进行分配。对它们的操作将在单独的函数中发生。出于某种原因,我将该函数声明为三重指针,如下所示:

***func( double ***A, double ***B, double ***C)
{
  do some work here on A, B and C
  return(A, B, C);
}

我知道数组作为引用传递给函数,所以基本上不需要从这个函数返回一些东西。但是,你能告诉我为什么有人会这样声明一个函数吗?这个工作人员让我很困惑。提前致谢

4

2 回答 2

5

return(A, B, C) is not C,您可以使用 astruct返回多个参数。

struct array3d{
  double* A;
  double* B;
  double* C;
};

struct array3d* func(struct array3d* p) {
  /* do some work here on p->A, p->B and p->C */
  return p;
}

这是一个带有***指针的工作示例:

#include <stdio.h>
#include <malloc.h>

struct array3d {
  double*** A;
  double*** B;
  double*** C;
};

struct array3d* func(struct array3d* p) {
  /* do some work here on A, B and C */

  ***p->A /= 42.0;
  ***p->B /= 42.0;
  ***p->C /= 42.0;

  return p;
}

int main()
{
    struct array3d arr;
    struct array3d* p_arr;

    double A[] = { 1.0,  3.0}; // ...
    double B[] = {-1.0, -2.0};
    double C[] = { 2.0,  4.0};

    double* p1A = A;
    double* p1B = B;
    double* p1C = C;

    double** p2A = &p1A;
    double** p2B = &p1B;
    double** p2C = &p1C;

    arr.A = &p2A;
    arr.B = &p2B;
    arr.C = &p2C;

    p_arr = func(&arr);

    printf("(A = %f, B = %f, C = %f)\n", ***p_arr->A, ***p_arr->B, ***p_arr->C);

    return 0;
}
于 2015-08-28T07:50:20.163 回答
0

编码

***func( double ***A, double ***B, double ***C)
{
  do some work here on A, B and C
  return(A, B, C);
}

是完全错误的,即使它编译:

  1. 如果函数通过其参数AB和返回所有内容C,则它不应该有返回类型。即,它应该被声明为 return void

    void func( double ***A, double ***B, double ***C) {
    
  2. 语法return(A, B, C)并不像您认为的那样。它不构造列表,也不将三个值传递给return. 相反,它对表达式A求值,将其值丢弃,求值B,将其值丢弃,求值C,将 的值C作为表达式的值(A, B, C),最后从函数返回该值。(谷歌“C逗号运算符”了解更多信息。)

  3. 如果您的函数被声明为返回void(可能应该如此),则根本不需要return声明。

于 2015-08-28T09:03:25.760 回答