C++逗号运算符问题,有点奇怪

cctime 2008-02-29 05:38:52
char *f()
{
printf("called\n");
return 0;
}

class CTest
{
public:
CTest(int i) : m_i(f(), i) { } //改成m_i((f(), i))结果会不一样
private:
int m_i;
};

void main()
{
CTest test(3);
}
...全文
466 11 打赏 收藏 举报
写回复
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
cctime 2008-07-17
  • 打赏
  • 举报
回复
2种情况程序编译都没有错,运行也没有异常,m_i都能初始化为3(理解为逗号运算的话,值就是3)。
只是多一层括号的话,f()得到执行,否则得不到执行。前些天好像想通了,今天又忘记咋回事了。
hai040 2008-07-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 e_sharp 的回复:]
引用 3 楼 Vitin 的回复:
因为表达式 m_i(f(),i) 是表示初始化语义的后缀表达式,其中,“,”并不是逗号表达式的操作符,而是参数列表(argument list)的分割符。因此,它表示构造m_i需要两个参数,这需要调用m_i所属类型的双参数构造函数,而int没有这样的构造函数,从而导致程序错误。

而对于表达式 m_i((f(),i)) ,由于内层括号的存在,变成了单参数的初始化,并使用子表达式(f(),i)的结果来初始化m_i。此时“,”是逗号表…
[/Quote]
古坟
e_sharp 2008-07-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 Vitin 的回复:]
因为表达式 m_i(f(),i) 是表示初始化语义的后缀表达式,其中,“,”并不是逗号表达式的操作符,而是参数列表(argument list)的分割符。因此,它表示构造m_i需要两个参数,这需要调用m_i所属类型的双参数构造函数,而int没有这样的构造函数,从而导致程序错误。

而对于表达式 m_i((f(),i)) ,由于内层括号的存在,变成了单参数的初始化,并使用子表达式(f(),i)的结果来初始化m_i。此时“,”是逗号表达式的操作符,该子表达式…
[/Quote]

正解

怎么不结贴阿,都这么久了
cumtxxl 2008-07-01
  • 打赏
  • 举报
回复
标题应该改成"C++括号运算符问题"
关逗号什么事了?
jinwei1984 2008-07-01
  • 打赏
  • 举报
回复
很强大!
学习了
dazhuaye 2008-07-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 Vitin 的回复:]
因为表达式 m_i(f(),i) 是表示初始化语义的后缀表达式,其中,“,”并不是逗号表达式的操作符,而是参数列表(argument list)的分割符。因此,它表示构造m_i需要两个参数,这需要调用m_i所属类型的双参数构造函数,而int没有这样的构造函数,从而导致程序错误。

而对于表达式 m_i((f(),i)) ,由于内层括号的存在,变成了单参数的初始化,并使用子表达式(f(),i)的结果来初始化m_i。此时“,”是逗号表达式的操作符,该子表达式…
[/Quote]
shougao_net 2008-03-05
  • 打赏
  • 举报
回复
c++技术Q群
35011905

欢迎各问高手加入
robertzhang10 2008-02-29
  • 打赏
  • 举报
回复
楼上正解
Vitin 2008-02-29
  • 打赏
  • 举报
回复
因为表达式 m_i(f(),i) 是表示初始化语义的后缀表达式,其中,“,”并不是逗号表达式的操作符,而是参数列表(argument list)的分割符。因此,它表示构造m_i需要两个参数,这需要调用m_i所属类型的双参数构造函数,而int没有这样的构造函数,从而导致程序错误。

而对于表达式 m_i((f(),i)) ,由于内层括号的存在,变成了单参数的初始化,并使用子表达式(f(),i)的结果来初始化m_i。此时“,”是逗号表达式的操作符,该子表达式的结果就是i,因此初始化完成后,m_i==i成立。
Supper_Jerry 2008-02-29
  • 打赏
  • 举报
回复
这个代码实在。。。。
ltc_mouse 2008-02-29
  • 打赏
  • 举报
回复
用Dev C++编译了下,没发现不一样呀。所谓的不一样是什么意思?一个有编译Warnings一个没有?
相关推荐
发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2008-02-29 05:38
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下