iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++超详细讲解逗号操作符
  • 760
分享到

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

2024-04-02 19:04:59 760人浏览 八月长安
摘要

目录一、逗号操作符二、重载逗号操作符三、小结一、逗号操作符 逗号操符( , )可以构成逗号表达式 逗号表达式用于将多个子表达式连接为一个表达式逗号表达式的值为最后一个子表达式的值逗号

一、逗号操作符

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

  • 逗号表达式用于将多个子表达式连接为一个表达式
  • 逗号表达式的值为最后一个子表达式的值
  • 逗号表达式中的前 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++逗号操作符内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++超详细讲解逗号操作符

本文链接: https://www.lsjlt.com/news/150246.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++超详细讲解逗号操作符
    目录一、逗号操作符二、重载逗号操作符三、小结一、逗号操作符 逗号操符( , )可以构成逗号表达式 逗号表达式用于将多个子表达式连接为一个表达式逗号表达式的值为最后一个子表达式的值逗号...
    99+
    2022-11-13
  • C++超详细讲解逻辑操作符
    目录一、逻辑运算符的原生语义二、重载逻辑操作符三、小结一、逻辑运算符的原生语义 操作数只有两种值( true和 false )逻辑表达式不用完全计算就能确定最终值最终结果只能是 tr...
    99+
    2022-11-13
  • C++超详细讲解操作符的重载
    目录一、需要解决的问题二、操作符重载三、小结一、需要解决的问题 下面的复数解决方案是否可行? 下面看一下复数的加法操作: #include <stdio.h> clas...
    99+
    2022-11-13
  • C语言操作符超详细讲解下篇
    目录前言赋值操作符单目操作符单目操作符介绍sizeof 和 数组关系操作符逻辑操作符条件操作符逗号表达式下标引用与函数调用和结构成员[ ] 下标引用操作符( ) 函数调用操作符访问一...
    99+
    2022-11-13
  • C语言操作符超详细讲解上篇
    目录前言1、操作符的分类2、算术操作符3、移位操作符3.1 左移操作符3.1.1 正数左移1位3.1.2 负数左移1位3.2 右移操作符3.2.1 正数右移1位3.2.2 负数右移1...
    99+
    2022-11-13
  • C++超详细讲解数组操作符的重载
    目录一、字符串类的兼容性二、重载数组访问操作符三、小结一、字符串类的兼容性 问题:string 类对象还具备 C 方式字符串的灵活性吗?还能直接访问单个字符吗? string 类最大...
    99+
    2022-11-13
  • C++超详细讲解字符串类
    目录一、历史遗留问题二、解决方案三、标准库中的字符串类四、字符串循环右移五、小结一、历史遗留问题 C 语言不支持真正意义上的字符串C 语言用字符数组和一组函数实现字符串操作C 语言不...
    99+
    2022-11-13
  • C++超详细讲解运算符重载
    目录概念赋值运算符重载const成员取地址及const取地址操作符重载概念 C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类 型,函数名...
    99+
    2022-11-13
  • C语言超详细讲解文件的操作
    目录一、为什么使用文件二、什么是文件1.程序文件2.数据文件3.文件名三、文件指针四、文件的打开和关闭五、文件的顺序读写六、文件的随机读写fseekftellrewind七、文件结束...
    99+
    2022-11-13
  • C++BoostUtility超详细讲解
    目录一、说明二、Boost.Utility库示例和代码一、说明 Boost.Utility 库是杂项、有用的类和函数的集合,它们太小而无法在独立库中维护。虽然实用程序很小并且可以快速...
    99+
    2022-12-08
    C++ Boost Utility C++ Utility库
  • C++BoostUuid超详细讲解
    目录一、说明二、Boost.Uuid库示例和代码一、说明 Boost.Uuid 为 UUID 提供生成器。 UUID 是不依赖于中央协调实例的通用唯一标识符。例如,没有数据库存储所有...
    99+
    2022-12-08
    C++ Boost Uuid C++ Uuid标识符
  • C++超详细讲解泛型
    目录1.了解泛型编程2.函数模板2.1简单示例2.2多个模板参数2.3模板实例化2.4模板和普通函数同时存在2.5函数模板不支持定义和声明分离3.类模板3.1简单示例3.2成员函数声...
    99+
    2022-11-13
  • C++ Boost Assign超详细讲解
    目录说明Exercise说明 Boost.Assign Boost.Assign 库提供了帮助函数来初始化容器或向容器添加元素。如果需要将许多元素存储在一个容器中,这些函数尤其有用。...
    99+
    2022-12-09
    C++ Boost Assign C++ Assign库
  • C语言超详细讲解字符串相乘
    目录前言一、分析思路二、使用步骤1、代码如下2、memset函数三、总结前言 我们已经知道,正常的两位整形数据通过*相乘,C语言中int为4字节,32bit(字节),其机器码第一位为...
    99+
    2022-11-13
  • Java 超详细讲解字符流
    目录一、字符流的由来二、编码表字符集:Unicode字符集:UTF-8编码规则:三、字符串中的编码解码问题编码方法(IDEA):解码方法(IDEA):四、字符流的编码解码问题四、字符...
    99+
    2022-11-13
  • Java超详细讲解IO操作字节流与字符流
    目录IO操作字节流FileInputStreamFileOutputStream字节流读写案例字符流FileReaderFileWriter字节流与字符流的区别IO操作 字节流 ...
    99+
    2022-11-13
  • C++中如何使用逗号操作符
    C++中如何使用逗号操作符,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。其实,我们是经常会用到逗号操作符的,但是并不是所有代码里出现的逗号都是逗号操作符。让我们先从一个类的示例...
    99+
    2023-06-17
  • C++超详细讲解标准库
    目录一、有趣的重载二、C++ 标准库三、小结一、有趣的重载 操作符 << 的原生意义是按位左移,例:1 <<2; 其意义是将整数 1 按位左移2位,即:000...
    99+
    2022-11-13
  • C++BoostPropertyTree示例超详细讲解
    目录一、提要二、应用示例练习一、提要 借助类 boost::property_tree::ptree,Boost.PropertyTree 提供了一个树结构来存储键/值对。树形结构意...
    99+
    2022-11-13
    C++ Boost PropertyTree C++ Boost PropertyTree示例
  • C++BoostVariant示例超详细讲解
    目录一、提要二、示例一、提要         Boost.Variant 提供了一个类似于 unio&...
    99+
    2022-11-13
    C++ Boost Variant C++ Boost Variant示例
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作