【问题标题】:Trouble in differentiating the Comma operator vs comma separator区分逗号运算符与逗号分隔符的麻烦
【发布时间】:2023-03-05 20:00:02
【问题描述】:

我无法将逗号区分为运算符或分隔符。经历了各种问题,但没有人解释逗号何时充当运算符与何时充当分隔符。答案只是说在这里它充当运算符,在那里它充当分隔符。 我的问题是我怎么能说看看什么时候逗号是运算符,什么时候是分隔符。 从历史上看,我知道运算符需要操作数,而逗号通常是分隔符。但是它如何转换为运算符让我感到困惑。

int a;
a = 1, 2, 3;
printf("%d", a);

int a = 1, 2, 3;
printf("%d", a);

【问题讨论】:

  • 当您查看此代码时,将 3 个值分配给 1 个 int 变量是否有意义?
  • @RetiredNinja - 它没有,但这不是我的问题。我的问题是关于区分逗号作为运算符和逗号作为分隔符的能力。第二个赋值是错误的,但仍然有逗号可以充当运算符的可能性。我无法查看代码,然后指出逗号是运算符或分隔符。
  • 你只需要学会识别不同的用途。以我的经验,逗号运算符很少使用,使用时非常明显。我不知道怎么会有人回答这个问题。
  • @RetiredNinja - 你说逗号用作运算符,使用时很明显。您为什么不分享一个逗号是运算符与逗号作为分隔符的示例?我只是想学习。
  • @Eljay 括号 ( ){ } 可能比逗号具有更多不同的上下文相关含义...

标签: c++ c++11 comma


【解决方案1】:

在可以使用逗号分隔符的上下文中,使用它。不能的时候是逗号。

逗号分隔符适用于:

  1. 各种初始化(这些在(){} 中发生,但并非所有此类括号都是初始化)。

    struct Bob {
      int x,y;
      Bob(int,int);
    };
    Bob b1{1,2};
    Bob b2 = Bob{1,2};
    Bob b3 = Bob(1,2);
    
  2. 声明多个变量

    int x =0, y =2;
    
  3. [] 捕获的 lambda。

    int x = 2, y = 0;
    std::cout << [x, y]() mutable { return x+y; }();
    
  4. 函数/方法调用参数和参数列表。

    void foo(int, int); // parameter list
    foo(1,2); // arguments
    
  5. 模板参数和参数列表。

    template<class T, class U>
    T convert(U u){ return T( std::forward<U>(u) ); }
    auto d = convert<double, int>(3);
    
  6. 枚举枚举器列表

    enum class Bird {
      Chicken,
      Raven,
      Roc,
    };
    

...我可能错过了什么。

否则要么是语法错误,要么是表达式,, 被视为逗号运算符。一个问题是operator[] 没有参数列表,因此vec[1,2] 中有一个, 运算符。不要依赖这一点,我已经看到标准委员会似乎有意弃用它并(可能最终)允许多参数[]

int a;
a = 1, 2, 3;

逗号运算符。 a123 被丢弃。

printf("%d", a);

逗号分隔符。

int a = 1, 2, 3;

无效代码。

printf("%d", a);

逗号分隔符。

【讨论】:

  • () 可以同时用于两者 - 与 FooClass(int,int) 一起,FooClass(1,2)FooClass((3,1),2) 执行相同的调用。
  • @Yakk-AdamNevraumont - 所以在我分享的代码中,我可以说逗号在这两种情况下都试图充当运算符吗?根据您的解释,我认为在我的代码示例中没有逗号用作分隔符?请确认。
  • @quimby - 所以在 FooClass(1,2) 中我可以说逗号充当分隔符吗?在我的代码示例中也是如此?
  • @Test OPO 中的代码示例包含逗号作为运算符和分隔符。我假设FooClass 是一个类的名称;那么是的,FooClass(1,2), 是分隔符的情况。
  • @Yakk-AdamNevraumont - 您能否详细说明一下在我的原始代码示例中逗号如何同时充当运算符和分隔符?
猜你喜欢
  • 1970-01-01
  • 2014-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
相关资源
最近更新 更多