ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – cout << a << a ;?的正确答案是什么?

2019-09-11 10:05:48  阅读:203  来源: 互联网

标签:c c-faq


最近在一次采访中有一个以下客观类型的问题.

int a = 0;
cout << a++ << a;

回答:

一个. 10
湾01
C.未定义的行为

我回答了选择b,即输出为“01”.

但令我惊讶的是,一位采访者告诉我,正确的答案是选项c:undefined.

现在,我确实知道C中序列点的概念.以下语句的行为未定义:

int i = 0;
i += i++ + i++;

但根据我对陈述cout<<的理解a<< a,ostream.operator<<()将被调用两次,首先使用ostream.operator<<(a)以及后来的ostream.operator<<(a). 我还检查了VS2010编译器的结果,其输出也是’01’.

解决方法:

你可以想到:

cout << a++ << a;

如:

std::operator<<(std::operator<<(std::cout, a++), a);

C保证先前评估的所有副作用都将在sequence points执行.函数参数评估之间没有序列点,这意味着可以在参数std :: operator<<之前评估参数a(std :: cout,a )或之后.所以上面的结果是不确定的. C 17更新 在C 17中,规则已经更新.特别是:

In a shift operator expression E1<<E2 and E1>>E2, every value computation and side-effect of E1 is sequenced before every value computation and side effect of E2.

这意味着它需要代码生成结果b,其输出01.

有关详细信息,请参见P0145R3 Refining Expression Evaluation Order for Idiomatic C++.

标签:c,c-faq
来源: https://codeday.me/bug/20190911/1804643.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有