【问题标题】:The limitations of the comma operator逗号运算符的局限性
【发布时间】:2011-05-31 15:27:43
【问题描述】:

我已经阅读了this 问题,我想补充一下,使用逗号运算符不能完成的事情是什么。这让我很困惑,因为我可以这样做:

int arr[3];
arr[0]=1,arr[1]=2,arr[2]=3;

但是当我这样做时:

int arr[3],arr[0]=1,arr[1]=2,arr[2]=3;

它给了我一个编译器错误。

请问逗号运算符在实际应用中有哪些限制?

【问题讨论】:

  • 还有一个有趣的问题是可以用逗号操作符做什么。重载逗号运算符是在编译时测试表达式类型是否为 void 的正确工具,即。 sizeof((expr, foo())) == sizeof(foo) 其中foo 是用户定义的类型,并且有一个template <typename T> foo (&operator,(T, foo))[2];。与“T = void”一起使用时,使用默认的逗号运算符。

标签: c++ c comma-operator


【解决方案1】:

需要意识到的一点是,并非所有 C 语言中使用的逗号都是逗号运算符的实例。将您的第二个示例更改为语法声明:

int a0=1,a1=2,a2=3;

逗号不是运算符,它们只是分隔列表中声明符实例所需的语法。

另外,参数/参数列表中使用的逗号不是逗号运算符。

在我看来,使用逗号运算符几乎总是一个坏主意——它只会造成不必要的混乱。在大多数情况下,使用逗号运算符完成的操作可以使用单独的语句更清楚地完成。

很容易想到的两个例外是在 for 语句的控制子句中,以及在绝对需要将多个“事物”塞入单个表达式的宏中,即使这样也只能在有没有其他合理的选择)。

【讨论】:

  • 即使它们只是这里的分隔符,它仍然应该声明一个3位数的数组并根据我从左到右分配值
  • @fahad:在某些情况下,逗号不是运算符,您链接到的页面还说,“在某些情况下,逗号可以用作分隔符,例如函数参数列表。不要混淆逗号作为分隔符的使用和它作为操作符的使用;这两种用法是完全不同的"
  • 哦,对不起,我改变了我的评论,你在两者之间抓住了我:)
  • 我更正了我的答案 - 问题是您在第二个示例中尝试执行的操作在声明中的语法不正确(这是您看到的错误)。有时在声明中使用的逗号不是“逗号运算符”。
  • int arr[3],arr[0]=1,arr[1]=2,arr[2]=3; 在语法上是正确的,因为它遵循语法规则。它尝试多次声明同一个数组(这是无效的),一次使用非法大小,并且使用不同的无效初始化程序。不过,这在语义上是非常错误的。
【解决方案2】:

您可以在表达式出现的大多数地方使用逗号运算符。有几个例外;值得注意的是,您不能在常量表达式中使用逗号运算符。

在逗号也用作分隔符的地方使用逗号运算符时也必须小心,例如,在调用函数时,必须使用括号对逗号表达式进行分组:

void f(int, bool);

f(42, 32, true);   // wrong
f((42, 32), true); // right (if such a thing can be considered "right")

你的例子是一个声明:

int arr[3],arr[0]=1,arr[1]=2,arr[2]=3;

在声明中,您可以通过逗号分隔来声明多个事物,因此这里也使用逗号作为分隔符。此外,您不能像这样将表达式添加到声明的末尾。 (注意使用int arr[3] = { 1, 2, 3 };可以得到想要的结果)。

【讨论】:

  • 可能值得指出的是,虽然逗号运算符可以用在需要 表达式 的地方,但在许多情况下,人们通常只考虑使用表达式 assignment-表达式是允许的。例如。函数参数,初始化器。
猜你喜欢
  • 1970-01-01
  • 2010-10-04
  • 2017-07-11
  • 2010-12-16
  • 1970-01-01
  • 2011-03-08
  • 2014-07-27
  • 2019-08-05
  • 2017-03-29
相关资源
最近更新 更多