【问题标题】:Return statement with more than one arguments具有多个参数的返回语句
【发布时间】:2015-11-22 19:24:13
【问题描述】:

在激活 -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);
}

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

【问题讨论】:

  • 为什么不返回数组
  • ***func( ... 不是有效的 C。至少如果在编译之前没有预处理器魔法......

标签: c arrays pointers return multiple-arguments


【解决方案1】:

代码

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

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

  1. 如果函数通过其参数ABC 返回所有内容,则它不应该有返回类型。即,应该声明返回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 语句。

【讨论】:

    【解决方案2】:

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

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      • 2021-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多