C 逗号运算符的作用是什么?

C 逗号运算符的作用是什么?,c,operators,comma-operator,C,Operators,Comma Operator,,运算符在C中做什么?表达式: (expression1, expression2) 首先计算表达式1,然后计算表达式2,并为整个表达式返回表达式2的值。表达式: (expression1, expression2) 首先计算expression1,然后计算expression2,并为整个表达式返回expression2的值。它导致计算多个语句,但仅使用最后一个语句作为结果值(我认为是右值) 所以 应将x设置为8。它会导致对多个语句求值,但只使用最后一个语句作为结果值(我认为是右值) 所

运算符在C中做什么?

表达式:

(expression1,  expression2)
首先计算表达式1,然后计算表达式2,并为整个表达式返回表达式2的值。

表达式:

(expression1,  expression2)

首先计算expression1,然后计算expression2,并为整个表达式返回expression2的值。

它导致计算多个语句,但仅使用最后一个语句作为结果值(我认为是右值)

所以


应将x设置为8。

它会导致对多个语句求值,但只使用最后一个语句作为结果值(我认为是右值)

所以


应将x设置为8。

正如前面的答案所述,它计算所有语句,但使用最后一个语句作为表达式的值。就我个人而言,我只发现它在循环表达式中有用:

for (tmp=0, i = MAX; i > 0; i--)

正如前面的答案所述,它计算所有语句,但使用最后一个语句作为表达式的值。就我个人而言,我只发现它在循环表达式中有用:

for (tmp=0, i = MAX; i > 0; i--)

我认为它唯一有用的地方是,当您编写一个时髦的循环时,您希望在其中一个表达式(可能是init表达式或循环表达式)中执行多项操作。类似于:

bool arraysAreMirrored(int a1[], int a2[], size_t size)
{
  size_t i1, i2;
  for(i1 = 0, i2 = size - 1; i1 < size; i1++, i2--)
  {
    if(a1[i1] != a2[i2])
    {
      return false;
    }
  }

  return true;
}
bool arraysaremirred(int a1[],int a2[],size\u t size)
{
尺寸为i1、i2;
对于(i1=0,i2=size-1;i1

请原谅,如果有任何语法错误,或者我混合了任何不严格的C语言。我不是说,运算符是好的形式,但这就是你可以使用它的原因。在上面的例子中,我可能会使用
while
循环,这样init和loop上的多个表达式会更明显。(我将以内联方式初始化i1和i2,而不是声明然后初始化……诸如此类。)

我认为它唯一有用的地方是当您编写一个时髦的循环时,您希望在其中一个表达式(可能是init表达式或循环表达式)中执行多项操作。类似于:

bool arraysAreMirrored(int a1[], int a2[], size_t size)
{
  size_t i1, i2;
  for(i1 = 0, i2 = size - 1; i1 < size; i1++, i2--)
  {
    if(a1[i1] != a2[i2])
    {
      return false;
    }
  }

  return true;
}
bool arraysaremirred(int a1[],int a2[],size\u t size)
{
尺寸为i1、i2;
对于(i1=0,i2=size-1;i1

请原谅,如果有任何语法错误,或者我混合了任何不严格的C语言。我不是说,运算符是好的形式,但这就是你可以使用它的原因。在上面的例子中,我可能会使用
while
循环,这样init和loop上的多个表达式会更明显。(我会以内联方式初始化i1和i2,而不是声明然后初始化……诸如此类。)

我在
中看到的应用最多,而
循环:

string s;
while(read_string(s), s.len() > 5)
{
   //do something
}
它将进行操作,然后根据副作用进行测试。另一种方法是这样做:

string s;
read_string(s);
while(s.len() > 5)
{
   //do something
   read_string(s);
}
for (low = 0, high = MAXSIZE; low < high; low = newlow, high = newhigh)
{
    /* do something with low and high and put new values
       in newlow and newhigh */
}

我在
循环中看到的应用最多:

string s;
while(read_string(s), s.len() > 5)
{
   //do something
}
它将进行操作,然后根据副作用进行测试。另一种方法是这样做:

string s;
read_string(s);
while(s.len() > 5)
{
   //do something
   read_string(s);
}
for (low = 0, high = MAXSIZE; low < high; low = newlow, high = newhigh)
{
    /* do something with low and high and put new values
       in newlow and newhigh */
}

逗号运算符将两边的两个表达式组合成一个表达式,按从左到右的顺序计算它们。右边的值作为整个表达式的值返回。
(expr1,expr2)
类似于
{expr1;expr2;}
,但您可以在函数调用或赋值中使用
expr2
的结果

循环中经常可以看到初始化或维护多个变量,如下所示:

string s;
read_string(s);
while(s.len() > 5)
{
   //do something
   read_string(s);
}
for (low = 0, high = MAXSIZE; low < high; low = newlow, high = newhigh)
{
    /* do something with low and high and put new values
       in newlow and newhigh */
}
当值为
short
s或
int
s时,我们这样做:

*((short *)ptr)++ = short_value;
*((int *)ptr)++ = int_value;
后来我们读到这不是真正有效的C,因为
(short*)ptr
不再是l值,不能递增,尽管我们当时的编译器并不介意。为了解决这个问题,我们将表达式分成两部分:

*(short *)ptr = short_value;
ptr += sizeof(short);
<>但是,这种方法依赖于所有的开发人员都记住把两个语句都放在一起。我们希望一个函数可以传递输出指针、值和值的类型。这是C,而不是C++的模板,我们不能有一个任意类型的函数,所以我们在宏:
#define ASSIGN_INCR(p, val, type)  ((*((type) *)(p) = (val)), (p) += sizeof(type))
通过使用逗号运算符,我们可以在表达式或语句中使用它:

if (need_to_output_short)
    ASSIGN_INCR(ptr, short_value, short);

latest_pos = ASSIGN_INCR(ptr, int_value, int);

send_buff(outbuff, (int)(ASSIGN_INCR(ptr, last_value, int) - outbuff));

我并不是说这些例子中的任何一个都是好的风格!事实上,我似乎记得Steve McConnell的代码Complete建议不要在for循环中使用逗号运算符:为了可读性和可维护性,循环应该只由一个变量控制,而for行中的表达式本身应该只有一个变量包含循环控制代码,而不是初始化或循环维护的其他额外位。

逗号运算符将两侧的两个表达式组合成一个表达式,按从左到右的顺序计算。右侧的值作为整个表达式的值返回。
(expr1,expr2)
类似于
{expr1;expr2;}
,但您可以在函数调用或赋值中使用
expr2
的结果

循环中经常可以看到初始化或维护多个变量,如下所示:

string s;
read_string(s);
while(s.len() > 5)
{
   //do something
   read_string(s);
}
for (low = 0, high = MAXSIZE; low < high; low = newlow, high = newhigh)
{
    /* do something with low and high and put new values
       in newlow and newhigh */
}
当值为
short
s或
int
s时,我们这样做:

*((short *)ptr)++ = short_value;
*((int *)ptr)++ = int_value;
后来我们读到这不是真正有效的C,因为
(short*)ptr
不再是l值,不能递增,尽管我们当时的编译器并不介意。为了解决这个问题,我们将表达式分成两部分:

*(short *)ptr = short_value;
ptr += sizeof(short);
<>但是,这种方法依赖于所有的开发人员都记住把两个语句都放在一起。我们希望一个函数可以传递输出指针、值和值的类型。这是C,而不是C++的模板,我们不能有一个任意类型的函数,所以我们在宏:
#define ASSIGN_INCR(p, val, type)  ((*((type) *)(p) = (val)), (p) += sizeof(type))
通过使用逗号运算符,我们可以在表达式或