服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++超详细讲解逗号操作符

C++超详细讲解逗号操作符

2022-12-13 14:16清风自在 流水潺潺 C/C++

使用逗号运算符是为了把几个表达式放在一起。整个逗号表达式的值为系列中最后一个表达式的值。从本质上讲,逗号的作用是将一系列运算按顺序执行

一、逗号操作符

逗号操符( , )可以构成逗号表达式

  • 逗号表达式用于将多个子表达式连接为一个表达式
  • 逗号表达式的值为最后一个子表达式的值
  • 逗号表达式中的前 N-1 个子表达式可以没有返回值
  • 逗号表达式按照从左向右的顺序计算每个子表达式的值

C++超详细讲解逗号操作符

下面看一个逗号表达式的示例:

#include <iostream>
using namespace std;
void func(int i)
{
  cout << "func(): i = " << i << endl;
}
int main()
{
  int a[3][3] = {
      (0, 1, 2),
      (3, 4, 5),
      (6, 7, 8)
  };
  int i = 0;
  int j = 0;
  while(i < 5)
      func(i),
  i++;
  for (i = 0; i < 3; i++)
  {
      for (j = 0; j < 3; j++)
      {
          cout << a[i][j] << endl;
      }
  }
  (i, j) = 6;
  cout << "i = " << i << endl;
  cout << "j = " << j << endl;
  return 0;
}

输出结果如下:

C++超详细讲解逗号操作符

注意三点:

1.使用括号,就不是初始化的方式,就变成了逗号表达式。要想其变成真正的初始化语句,需要把圆括号改成花括号。即

   int a[3][3] = {
      {0, 1, 2},
      {3, 4, 5},
      {6, 7, 8}
  };

2.这个

while(i < 5)
      func(i),
  i++;

等价于

while(i < 5)
{
  func(i);
  i++; 
}

3.(i, j) = 6; 按照逗号表达式的规则,就是等价于 j = 6;

 

二、重载逗号操作符

  • 在C++ 中重载逗号操作符是合法的
  • 使用全局函数对逗号操作符进行重载
  • 重载函数的参数必须有一个是类类型
  • 重载函数的返回值类型必须是引用

C++超详细讲解逗号操作符

下面来尝试一下重载逗号操作符:

#include <iostream>
using namespace std;
class Test
{
  int mValue;
public:
  Test(int i)
  {
      mValue = i;
  }
  int value()
  {
      return mValue;
  }
};
Test& operator , (const Test& a, const Test& b)
{
  return const_cast<Test&>(b);
}
Test func(Test& i)
{
  cout << "func(): i = " << i.value() << endl;
  return i;
}
int main()
{
  Test t0(0);
  Test t1(1);
  Test tt = (func(t0), func(t1));
  cout << tt.value() << endl;
  return 0;
}

输出结果如下:

C++超详细讲解逗号操作符

其中

Test tt = (func(t0), func(t1));

等价于:

Test tt = (operator , (func(t0), func(t1)));

问题的本质分析

  • C++ 通过函数调用扩展操作符的功能
  • 进入函数体前必须完成所有参数的计算
  • 函数参数的计算次序是不定的
  • 重载后无法严格从左向右计算表达式

可以看一下不重载会输出什么,把下面这段注释掉。

Test& operator , (const Test& a, const Test& b)
{
  return const_cast<Test&>(b);
}

输出如下:

C++超详细讲解逗号操作符

可以看到不重载逗号操作符是按照从左到右执行,重载后反而不正常了,所以逗号操作符没有重载的必要。

注意事项:工程中不要重载逗号操作符!!!

 

三、小结

  • 逗号表达式从左向右顺序计算每个子表达式的值
  • 逗号表达式的值为最后一个子表达式的值
  • 操作符重载无法完全实现逗号操作符的原生意义
  • 工程开发中不要重载逗号操作符

到此这篇关于C++超详细讲解逗号操作符的文章就介绍到这了,更多相关C++逗号操作符内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_43129713/article/details/124550726

延伸 · 阅读

精彩推荐
  • C/C++C语言指针详解及用法示例

    C语言指针详解及用法示例

    这篇文章主要介绍了C语言指针详解及用法示例,介绍了其相关概念,然后分享了几种用法,具有一定参考价值。需要的朋友可以了解下。...

    、起眼5762021-06-09
  • C/C++深入解析C++中的构造函数和析构函数

    深入解析C++中的构造函数和析构函数

    析构函数:在撤销对象占用的内存之前,进行一些操作的函数。析构函数不能被重载,只能有一个...

    C++教程网2052020-12-24
  • C/C++浅谈 C++17 里的 Visitor 模式

    浅谈 C++17 里的 Visitor 模式

    Visitor模式经常用于将更新的设计封装在一个类中,并且由待更改的类提供一个接受接口,其关键技术在于双分派技术,本文主要介绍 C++17 里的 Visitor 模式...

    hedzr11032022-01-07
  • C/C++C语言实现Linux下的socket文件传输实例

    C语言实现Linux下的socket文件传输实例

    这篇文章主要介绍了C语言实现Linux下的socket文件传输的方法,较为详细的分析了C语言文件Socket文件传输客户端与服务器端相关实现技巧,需要的朋友可以参考...

    红薯7382021-02-27
  • C/C++一篇文章带你了解C语言函数递归

    一篇文章带你了解C语言函数递归

    这篇文章主要为大家详细介绍了C语言函数递归,使用数据库,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Catzzz66611452022-09-15
  • C/C++C++ cin.get用法案例详解

    C++ cin.get用法案例详解

    这篇文章主要介绍了C++ cin.get用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    xusong6352021-12-27
  • C/C++C++ class和struct到底有什么区别详解

    C++ class和struct到底有什么区别详解

    这篇文章主要介绍了C++ class和struct到底有什么区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    C语言中文网11372021-10-26
  • C/C++Qt编写地图综合应用之绘制覆盖物折线

    Qt编写地图综合应用之绘制覆盖物折线

    折线图目前应用最广的也是用来绘制各种轨迹,折线图其实就是后面动态轨迹图、飞机航线图的前身,公用的一个方法addPolyline。本文将教大家如何通过Q...

    feiyangqingyun11732022-07-22