如何在一行中递增或递减C中函数调用中的指针参数值?

如何在一行中递增或递减C中函数调用中的指针参数值?,c,pointers,C,Pointers,我有以下代码: #include <stdio.h> int foo2(int *px, int *py) { int sum = *px + *py; *px = *px + 1; *py = *py - 1; printf("foo2 : res=%d x=%d y=%d\n", sum, *px, *py); return sum; } int main() { int x = 4, y = 7, res;

我有以下代码:

#include <stdio.h>

int foo2(int *px, int *py)
{
    int sum = *px + *py;
    *px = *px + 1;
    *py = *py - 1;
    printf("foo2 : res=%d x=%d y=%d\n", sum, *px, *py);
    return sum;
}

int main() {
    int x = 4, y = 7, res;
    res = foo2(&(x++), &(y--));
    printf("%d", res);

    return 0;
}
#包括
int foo2(int*px,int*py)
{
整数和=*px+*py;
*px=*px+1;
*py=*py-1;
printf(“foo2:res=%d x=%d y=%d\n”,和,*px,*py);
回报金额;
}
int main(){
int x=4,y=7,res;
res=foo2(&(x++),&(y--);
printf(“%d”,res);
返回0;
}
我需要递增
x
,递减
y
,然后我需要将它们作为参数传递到
foo
函数中

我有
错误:左值必须作为一元操作数'&'操作数
。我还尝试使用
x+1
y-1
而不是
x++
y++


如何增加
x
y
值,并在
foo2
函数调用中传递指向它们的指针?可能吗?

您可以使用逗号运算符:

res = foo2((x++, &x), (y--, &y));
但是,这不是很容易理解,因此除非您有很好的理由,否则最好将其写成三个单独的语句:

x++;
y--;
res = foo2(&x, &y);

我只想在这里补充几点:

C

在c中,前缀和后缀增量都返回
rvalue
。这就是为什么当您试图在c中获取post/pre increment的地址时会出现错误

C++

<>但在C++中,前缀(++x)返回<代码> LValue/COD> > <代码>后缀(X++)返回<代码> rValue/COD>。因此,在C++中,<代码>和(++x)< /C>是正确的,而<代码>和(x++)会引发错误。

注意:


我鼓励你多读一点。它将帮助您更好地理解。

关于一条语句
foo2((x++,&x),(y-,&y))
foo2(++x,&x),(-y,&y))
foo2((x+=1,&x),(y--=1,&y))
所有的操作都是相同的,对应于
我需要增加x,减少y,然后我需要将它们作为参数传递到foo函数中
,注意x和y都被赋予了它们的新值foo@bruno我想在
y--=1
中有太多的负号,但这是一个很好的注释。或者
res=x++,y--,foo2(&x,&y)集中在一行上,您不希望在函数调用内部进行更改。@Roberts SupportsMonicacellio是的,双减号是一个拼写错误,是的,有很多方法可以做到。。。而且可读性不如几行或只做
intx=5,y=6,res
^^@diduk001这只是一个示例,您希望在循环内部使用in-和Decremations以及函数调用或类似的方法,因为在给定的示例中,仅使用正确的值初始化变量更合适。是的,我知道它不可读,但我想知道我是否可以这样做,只是一种实验。无论如何,谢谢你的回答。我鼓励你永远不要写这样的代码,即使它是合法的——它是脆弱的,因为它在一条语句中创建了一些排序依赖项。这可能是非常容易出现错误的,因为很难准确地理解该语句中发生了什么。由于这些排序依赖关系,在未排序语句(如函数调用)中使用此类代码的多个实例可能会导致在多个实例之间存在依赖关系时出现未定义行为的风险。如果要递增
x
并将其地址传递给函数,请分两行执行。