代码之家  ›  专栏  ›  技术社区  ›  Prabhat Choudhary

对整数变量n c的逗号分隔赋值[重复]

  •  -1
  • Prabhat Choudhary  · 技术社区  · 10 年前

    我无法理解这段代码的工作原理。

    #include<stdio.h>
    void main(){
      int a,b;
      a=3,1;
      b=(5,4);
      printf("%d",a+b);
    }  
    

    输出为 7 。那是什么任务?

    3 回复  |  直到 10 年前
        1
  •  4
  •   haccks    10 年前

    逗号运算符计算其第一个操作数并丢弃结果,然后计算第二个操作数,并返回此值。

    执行后

    a=3,1;  //  (a = 3), 1;
    

    a 将具有 3 和之后

    b=(5,4);  // Discard 5 and the value of the expression (5,4) will be 4
    

    b 将具有 4 .

    关于 Wikipedia :

    // Examples:               Descriptions:                                                                   Values after line is evaluated:
    int a=1, b=2, c=3, i=0; // commas act as separators in this line, not as an  operator 
                            // ... a=1, b=2, c=3, i=0
    i = (a, b);             // stores b into i 
                            // ... a=1, b=2, c=3, i=2
    i = a, b;               // stores a into i. Equivalent to (i = a), b;
                            // ... a=1, b=2, c=3, i=1
    i = (a += 2, a + b);    // increases a by 2, then stores a+b = 3+2 into i
                            // ... a=3, b=2, c=3, i=5
    i = a += 2, a + b;      // increases a by 2, then stores a to i, and discards unused
                            // a + b rvalue. Equivalent to (i = (a += 2)), a + b; 
                            // ... a=5, b=2, c=3, i=5
    i = a, b, c;            // stores a into i, discarding the unused b and c rvalues
                            // ... a=5, b=2, c=3, i=5
    i = (a, b, c);          // stores c into i, discarding the unused a and b rvalues
                            // ... a=5, b=2, c=3, i=3
    return a=4, b=5, c=6;   // returns 6, not 4, since comma operator sequence points
                            // following the keyword 'return' are considered a single
                            // expression evaluating to rvalue of final   subexpression c=6
    return 1, 2, 3;         // returns 3, not 1, for same reason as previous example
    return(1), 2, 3;        // returns 3, not 1, still for same reason as above.  This
                            // example works as it does because return is a keyword, not 
                            // a function call. Even though most compilers will allow for
                            // the construct return(value), the parentheses are syntactic
                            // sugar that get stripped out without syntactic analysis 
    
        2
  •  2
  •   pmg    10 年前
      a=3,1; // (a=3),1 -- value of expression is 1, side effect is changing a to 3
      b=(5,4);
      printf("%d",a+b); // 3 + 4
    
        3
  •  2
  •   Fiddling Bits    10 年前

    在本声明中

    a=3,1;
    

    使用了两个运算符:赋值运算符和逗号运算符。赋值运算符的优先级大于逗号运算符的优先级,因此此语句等效于

    ( a = 3 ), 1;
    

    1 被简单地丢弃,因此 a 已分配值 3 .

    在本声明中

    b=(5,4);
    

    由于括号的原因,首先计算逗号运算符。其值是最后一个表达式的值, 4 所以 b 已分配值 4. .

    结果你得到 a + b => 3 + 4 等于 7 .