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

 更新时间:2022年05月31日 11:02:58   作者:清风自在 流水潺潺  
使用逗号运算符是为了把几个表达式放在一起。整个逗号表达式的值为系列中最后一个表达式的值。从本质上讲,逗号的作用是将一系列运算按顺序执行

一、逗号操作符

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

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

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

#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;
}

输出结果如下:

注意三点:

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++ 中重载逗号操作符是合法的
  • 使用全局函数对逗号操作符进行重载
  • 重载函数的参数必须有一个是类类型
  • 重载函数的返回值类型必须是引用

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

#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;
}

输出结果如下:

其中

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++核心编程之占位参数和默认参数

    C++核心编程之占位参数和默认参数

    这篇文章主要介绍了C++核心编程之占位参数和默认参数,c++中函数的形参列表中的形参是可以有默认值的,函数的形参列表里可以有占位参数,用来占位,调用函数时必须填补位置。下面更多相关内容的详细介绍,需要的小伙伴可以参考一下
    2022-03-03
  • C++超详细讲解友元的使用

    C++超详细讲解友元的使用

    采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该类的友元函数
    2022-04-04
  • C语言使用setjmp和longjmp实现一个简单的协程

    C语言使用setjmp和longjmp实现一个简单的协程

    这篇文章主要为大家介绍了C语言使用setjmp和longjmp实现一个简单的协程过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • C++入门之vector使用详解

    C++入门之vector使用详解

    这篇文章主要为大家介绍了C++入门之vector使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • c++实现reactor高并发服务器的详细教程

    c++实现reactor高并发服务器的详细教程

    这篇文章主要介绍了c++从零实现reactor高并发服务器,包括环境准备和基础知识介绍,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-03-03
  • OpenGL绘制Bezier曲线的方法

    OpenGL绘制Bezier曲线的方法

    这篇文章主要为大家详细介绍了OpenGL绘制Bezier曲线的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C++回文数及素数问题计算方法

    C++回文数及素数问题计算方法

    这篇文章主要介绍了C++回文数及素数问题计算方法,可实现一定范围内的素数与回文数运算功能,涉及C++字符串遍历与数字数学运算的相关技巧,需要的朋友可以参考下
    2016-05-05
  • C++移动操作,RVO和NRVO详细

    C++移动操作,RVO和NRVO详细

    本文将讨论了何时C++会自动进行移动操作,并且说明了复制消除,RVO和NRVO优的化等香瓜吧资料,需要的小伙伴可以参考一下
    2021-09-09
  • 利用C++11原子量如何实现自旋锁详解

    利用C++11原子量如何实现自旋锁详解

    当自旋锁尝试获取锁时以忙等待(busy waiting)的形式不断地循环检查锁是否可用,下面这篇文章主要给大家介绍了关于利用C++11原子量如何实现自旋锁的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-06-06
  • 使用VC++实现打印乘法口诀表

    使用VC++实现打印乘法口诀表

    本文给大家分享的是一个超级简单的小例子,使用vc++打印乘法口诀表,给需要的小伙伴参考下吧。
    2015-03-03

最新评论