算子在C中做什么呢?
当前回答
我看到它唯一有用的地方是当你写一个古怪的循环,你想在一个表达式(可能是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;
}
如果有任何语法错误,或者我混合了任何不是严格c的东西,请原谅,我不是说,操作符是一种很好的形式,但这就是你可以使用它的原因。在上面的例子中,我可能会使用while循环,这样init和loop上的多个表达式会更明显。(我将内联初始化i1和i2,而不是声明然后初始化....等等等等。)
其他回答
逗号操作符将计算左操作数,放弃结果,然后计算右操作数,这就是结果。链接中提到的习惯用法是在初始化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
它导致对多个语句求值,但只使用最后一个语句作为结果值(我认为是右值)。
所以…
int f() { return 7; }
int g() { return 8; }
int x = (printf("assigning x"), f(), g() );
应该导致x被设置为8。
表达式:
(expression1, expression2)
首先求出expression1的值,然后求出expression2的值,然后返回整个表达式的expression2的值。
我在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 (tmp=0, i = MAX; i > 0; i--)