在单个参数函数中传递带括号的两个值

时间:2017-01-21 09:14:51

标签: c gcc operator-precedence

我从一个要求提供代码输出的网站上得到了这个问题

$this->db->select('COUNT(*) as total');
    $this->db->where('where', 0); 
   $query =  $this->db->get('table');

输出为void reverse(int i) { if (i > 5) return ; printf("%d ", i); return reverse((i++, i)); } int main(int argc, char *argv[]) { reverse(1); return 0; }

但是1 2 3 4 5函数被称为在parantheses中递归传递两个值。优先级和关联性如何在这里工作?

4 个答案:

答案 0 :(得分:5)

,中的

(i++, i)是逗号运算符。它的操作数从左到右进行评估。它评估i++i的值增加并且表达式i++的值被丢弃,然后递增的值被传递给函数。因此,最终只有一个参数传递给函数reverse

答案 1 :(得分:4)

这不是带有额外括号的两个值,而是包含comma operator一个参数。

答案 2 :(得分:3)

根据haccks,这是一个逗号运算符。

表达式:

(i++,  i)

首先评估 expression1 ,然后评估 expression2 ,并为整个表达式返回的expression2值

答案 3 :(得分:1)

阐释:

void reverse(int i)
{
    if (i > 5)
       return ;
    printf("%d ", i);
    return reverse((i++, i)); // it's single arument that is (i++ , i)
 }
 int main(int argc, char *argv[]) {
    reverse(1);
    return 0;
 }

更多解释如

a = (1, 2, 3);

(1,2,3)是一个参数但是分配给了什么?

使用括号,因此首先执行逗号运算符,然后将a指定为3 首先执行逗号之前的语句,然后分配3

在您的情况下
 首先执行i++,然后将i作为参数传递