在编译激活了-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);
}
我知道数组作为引用传递给函数,所以本质上不需要从这个函数返回任何东西。但是,你能告诉我为什么有人会这样声明一个函数吗?这根棍子把我弄糊涂了。提前感谢
,您可以使用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;
}
代码
***func( double ***A, double ***B, double ***C)
{
do some work here on A, B and C
return(A, B, C);
}
是完全错误的,即使它编译:
如果函数通过其参数
A
,B
和C
返回所有内容,则它不应该有返回类型。也就是说,应该声明它返回void
:void func( double ***A, double ***B, double ***C) {
语法
return(A, B, C)
并不像你想象的那样。它不构造一个列表,也不向return
传递三个值。相反,它计算表达式A
,抛出它的值,计算B
,抛出它的值,计算C
,将C
的值作为表达式(A, B, C)
的值,最后从函数返回该值。(谷歌"C逗号操作符"获取更多信息)如果你的函数被声明为返回
void
(它可能应该是),那么根本不需要return
语句。