下标运算符中的逗号运算符?

6

我对逗号运算符感到很困惑。我从未见过这种语法的代码?但我很好奇它是否有用处?为什么它在C++20中被弃用了?

#include <iostream>
int main()
{
    int  a[5]{1,2,3,45,5};
    std::cout << a[(2,3)] <<'\n';  //  this is work , in c++17 works
    std::cout << a[2,3] << '\n';   // but this is deprecated in c++20 ,in c++17 works
    return 0;
}

4
你进行了哪些研究?你阅读了提案吗? - KamilCuk
听起来很熟悉:https://www.youtube.com/watch?v=qD1aKLux5Fw - Bob__
@Bob_ 但是我仍然不明白为什么它没有打印出3。世界上为什么会有人想要使用? - Nilesh Solanki
2
请注意,索引从0开始。因此,在2, 3中,2被“忽略”,选择的是索引 3(即45)处的元素。 - Bob__
逗号运算符在每本C++书中都有解释,你读过其中一本吗?使用逗号运算符的情况非常少,甚至更少的是重载它以执行某些有用的操作的巧妙方法,废弃它将使其在未来变得更加实用。 - phuclv
显示剩余2条评论
2个回答

13
重要的是要认识到逗号作为表达式运算符和作为某种语法术语之间分隔符的区别。它们使用相同的标点符号,但它们没有相同的含义
在大括号初始化列表的{}中,单个项用逗号分隔。所以{1,2,3,45,5}是一系列项。这是逗号作为分隔符。
然而,在一般表达式中,逗号作为表达式运算符。当逗号作为两个表达式项之间的表达式运算符时,它的含义是评估左侧表达式,丢弃其结果,然后评估右侧表达式,该表达式的值是整个表达式的结果。
在方括号[]中,逗号在C++17中不是分隔符。因此,它作为表达式运算符。a[2,3] 的含义是先评估 2,然后丢弃它,再评估 3。因此使用的索引将是3。
C++20废弃了直接表达式中使用逗号表达式。它这样做是为了使未来的C++标准版本可以将[]中的逗号变成逗号分隔符,而不是逗号运算符。也就是说,[2, 3]将使2和3成为重载的operator[]参数的调用。这类似于函数参数使用逗号分隔的方式。因此,如果您需要在函数调用中使用逗号运算符处理两个表达式,您必须将它们包装在()中: func(1, (2, 3))。这个函数接受两个参数,第二个参数是应用逗号运算符后得到的结果。

3

被弃用的主要原因是希望将语法用于未来的多维下标操作符。

您已经提到了其他三个弃用原因:

  • 它在实践中很少使用
  • 当使用它时,人们经常感到困惑
  • 人们很难想出为什么允许使用它

哦,天啊!迫不及待地想要使用适当的语言多维下标! - davidbak
@davidbak 你等不及了吗?在此期间可以使用Common Lisp!;) - BitTickler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接