第39课 逗号操作符的分析

本文深入解析C++中的逗号操作符,探讨其在连接多个子表达式时的作用及计算顺序,同时分析了逗号操作符在工程实践中的应用限制,并提供了详细的实验代码示例。
本文内容来自于对狄泰学院 唐佐林老师 C++深度解析 课程的学习总结

逗号操作符

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

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

实验代码
测试逗号操作符

#include <iostream>
#include <string>

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

实验代码
在实现一个重载逗号操作符全局函数

#include <iostream>
#include <string>

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));         // Test tt = func(t1);
    
    cout << tt.value() << endl; // 1
    
    return 0;
}

运行结果
在这里插入图片描述

实验结果:运行结果虽然是对的,但func(t0)和func(t1)的计算顺序不对,逗号操作符应该是从左往右计算的

问题的本质分析

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

工程中 不要重载 逗号操作符 !!!




小结

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lzg2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值