这条“最大”线是什么意思?

时间:2014-12-11 19:30:37

标签: c max

我不明白以下几行。 sockfd1 sockfd2 是套接字。

max = (sockfd1 < sockfd2 ? sockfd2 : sockfd1);

我将这一行用于选择:

//Initialisation du fd_set    
FD_ZERO(&readfds);
FD_SET(sockfd1, &readfds);
FD_SET(sockfd2, &readfds);
max = (sockfd1 < sockfd2 ? sockfd2 : sockfd1);

//Le select()    
select(max+1, &readfds, NULL, NULL, NULL);

感谢您的帮助:)

5 个答案:

答案 0 :(得分:4)

三元运算符?:计算其第一个参数,如果它是真的,则返回第二个,否则返回第三个。因此,如果sockfd1 < sockfd2,结果将为sockfd2,否则为sockfd1 - 换句话说,max会收到数字更大的套接字文件描述符。

答案 1 :(得分:2)

似乎所有其他答案都在解释三元运算符。我猜你很困惑,因为这段代码是用数字比较两个插座的。

在Linux / Unix中,socket()是创建套接字的函数,但它只返回一个整数。操作系统需要在套接字上发送和接收数据的所有其他数据(例如其IP地址)都存储在内核中。当您调用类似send()的API时,您传递此数字,内核使用它来查找有关其自己的数据结构中的套接字的所有其他相关信息。

Unix中的文件,管道和其他东西的行为方式相同。这些整数称为文件描述符。

所以这段代码比较了两个文件描述符的数值。除了在两个套接字上定义任意排序之外,我无法想到为什么这会有用。文件描述符的数值没有意义。

答案 2 :(得分:1)

它将max设置为sockfd1sockfd2中的较大者。

答案 3 :(得分:1)

相同
if (sockfd < sockfd)
  max = sockfd2;
else
  max = sockfd1;

三元运算符?:只是syntaxic sugar

答案 4 :(得分:0)

使用所谓的条件或三元运算符:

(sockfd1 < sockfd2 ? sockfd2 : sockfd1);

如果表达

sockfd1 < sockfd2

为true,则运算符的值为sockfd2,否则为sockfd1

因此,max将被分配两个值之间的最大值。

来自C标准(6.5.15条件运算符)

  

4评估第一个操作数;之间有一个序列点   它的评估和第二或第三操作数的评估   (以评估者为准)。仅当第二个操作数被评估时才会被评估   首先比较不等于0;第三个操作数仅在以下情况下进行评估   第一个比较等于0;结果是第二个的值   或第三个操作数(以评估者为准),转换为该类型   如下所述.110)*

相关问题