代码之家  ›  专栏  ›  技术社区  ›  Aakash Goel

什么时候逗号运算符不起逗号运算符的作用?

  •  8
  • Aakash Goel  · 技术社区  · 15 年前

    如果你看到这个代码,

    class A{
    public:
        A(int a):var(a){}
        int var;
    };
    
    int f(A obj) {
        return obj.var;
    }
    
    int main() {
        //std::cout<<f(23);    // output: 23
        std::cout<<f(23, 23);  // error: too many arguments to function 'int f(A)'
        return 0;
    }
    

    f(23, 23) 不编译,因为逗号在这里用作分隔符,而不是逗号运算符。

    这里都是逗号

    5 回复  |  直到 15 年前
        1
  •  11
  •   phonetagger    11 年前

    从语法的角度来看,函数调用的参数是可选的 表达式列表 括号内。安 表达式列表 赋值表达式 是预期的。

    逗号运算符使 表达 ,一个 , 和一个 赋值表达式 表达 包含逗号运算符本身不是 所以不能出现在 表达式列表 .

    例如,可以围绕任何 表达 (包括使用逗号运算符的圆括号)从 主表达式 赋值表达式 因此在一个

    例如。

    后缀表达式 表达式列表 赋值表达式 每一个都是一个 标识符

    f( a, b );
    

    在哪里 表达式列表 赋值表达式 这是一个 表达

    f( (a, b) );
    
        2
  •  8
  •   Justin Niessner    15 年前

    使用逗号标记作为 操作员是 变量声明,枚举 声明和类似的构造, 作为分隔物。

    Wikipedia - Comma operator

        3
  •  8
  •   Johannes Schaub - litb    15 年前

    我查了一下标准草案。基本上,在语法上 -list 表达式列表 直接委托给

    • 表达式列表 函数/构造函数参数 (包括功能铸型)
    • 项目的项目列表 枚举
    • 初始化声明程序列表 在一个文件中声明的不同名称 宣言

      例子:

      int a, b;
      
    • 这个 参数 申报表(惊喜!)的
    • 初始值设定项列表 (初始化数组或结构)
    • 成员声明符列表 成员声明

      例子:

      struct A { int a, b; };
      
    • 基本说明符列表 基类
    • 项目列表 对于

      例子:

      struct A { A():a(0), b(0) { } int a; int b; };
      
    • 模板参数列表 列表 模板参数
    • 模板参数列表 模板参数 传递给模板。
    • 的类型列表 例外规范

      例子:

      void f() throw(int, bool) { }
      

    标识符列表

        4
  •  7
  •   GManNickG    15 年前

    这与表达式的语言定义有关,它相当复杂。

    f(1, 2) f((1, 2)) 是具有一个参数的函数调用表达式,该参数是子表达式 1, 2

        5
  •  1
  •   Jerry Coffin    15 年前

    逗号运算符总是充当逗号运算符,但逗号并不总是表示逗号运算符--有时只是标点符号。