算子在C中做什么呢?


当前回答

我在while循环中见过最常用的:

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循环中使用的变量时,它给出了以下示例:

void rev(char *s, size_t len)
{
  char *first;
  for ( first = s, s += len - 1; s >= first; --s)
      /*^^^^^^^^^^^^^^^^^^^^^^^*/ 
      putchar(*s);
}

除此之外,逗号操作符并没有很多重要的用途,尽管它很容易被滥用,从而生成难以阅读和维护的代码。

来自C99标准草案的语法如下:

expression:
  assignment-expression
  expression , assignment-expression

第二段说:

逗号操作符的左操作数被计算为空表达式;求值后存在一个序列点。然后对右操作数求值;结果有它的类型和值。97)如果试图修改逗号操作符的结果或在下一个序列点之后访问它,该行为是未定义的。

脚注97说:

逗号操作符不会产生左值。

这意味着不能对逗号操作符的结果赋值。

需要注意的是,逗号操作符的优先级最低,因此在某些情况下使用()会产生很大的不同,例如:

#include <stdio.h>

int main()
{
    int x, y ;

    x = 1, 2 ;
    y = (3,4) ;

    printf( "%d %d\n", x, y ) ;
}

将有以下输出:

1 4

表达式:

(expression1,  expression2)

首先求出expression1的值,然后求出expression2的值,然后返回整个表达式的expression2的值。

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

所以…

int f() { return 7; }
int g() { return 8; }

int x = (printf("assigning x"), f(), g() );

应该导致x被设置为8。

正如前面的回答所述,它对所有语句求值,但使用最后一个语句作为表达式的值。我个人认为它只在循环表达式中有用:

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

我恢复这个只是为了回答@Rajesh和@JeffMercado的问题,我认为这很重要,因为这是搜索引擎的热门之一。

以下面的代码片段为例

int i = (5,4,3,2,1);
int j;
j = 5,4,3,2,1;
printf("%d %d\n", i , j);

它会打印出来

1 5

对于i的情况,大多数答案都是这样解释的。所有表达式都按从左到右的顺序求值,但只有最后一个表达式被赋值给i。(表达式)的结果是1 '。

j大小写遵循不同的优先级规则,因为,具有最低的运算符优先级。因为这些规则,编译器看到赋值表达式,常量,常量....表达式再次按从左到右的顺序求值,并且它们的副作用仍然可见,因此,由于j = 5, j = 5。

有趣的是,int j = 5,4,3,2,1;语言规范不允许。初始化式需要赋值表达式,因此不允许使用直接操作符。

希望这能有所帮助。