将逗号分隔的多个整数分配给C中的int - 为什么这样做?做什么的?

Ely*_*Ely 7 c variable-assignment

我在考试中看到了这一点,当我尝试时,我很惊讶.我在网上尝试过,它也有效.所以我认为这是C语言.

为什么这样?这种赋值语法的用例是什么?

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) {
    int i = (1,2,3,4,5);
    printf("%d", i);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

too*_*ite 9

这些不是"多个整数",而是逗号运算符.整个括号部分是一个单独的表达式,每个子表达式(用逗号分隔)严格从左到右进行评估.除最右边的子表达式之外的所有结果都被忽略.整个表达式的结果是最后(最右边)表达式的结果.这是整数值5.

请注意,此运算符主要用于只允许单个表达式添加进一步副作用的情况.例如在一个循环中:

int cnt = 0;
for ( const char *cp = "Hello" ; *cp != '\0' ; cp++, cnt++ )  ;
Run Code Online (Sandbox Code Playgroud)

这会计算C字符串中的字符数,递增指针以及cnt每次迭代后.这里忽略了结果.

所以,这是没有丝毫关系的元组或类似像Python编写的.实际上没有任何情况下使用此运算符是不可避免的,应谨慎使用 - 并且某些编码标准禁止使用它.

  • 在您的示例中,只有第二个`,`是逗号运算符,第一个是逗号分隔符. (2认同)

Jon*_*ler 7

那是工作中的逗号运算符.它评估左侧的表达式,创建一个序列点,丢弃表达式的值,然后计算右侧的表达式,并将其作为值返回.如示例中有多个表达式,则依次计算每个表达式,并保留最后一个表达式.使用该示例,编译器会执行评估,因为每个值在编译时都是已知的.请注意,函数的参数列表不是逗号运算符的使用.

这不是逗号运算符的有效用例.可能是更接近有效的用例的是一些需要排序的副作用(例如函数调用)的操作以及分配的最终值:

int i = (getchar(), getchar(), getchar());
Run Code Online (Sandbox Code Playgroud)

i如果要读取的标准输入中没有剩下三个字符,则设置为标准输入中的第三个字符,或EOF.仍然不是一个现实的用例,但比分配常量列表更好.