当前位置: 首页 > article >正文

C++ Brain Teasers: 未指定和实现定义的行为-函数参数的求值顺序

C++ 标准并未严格指定所有内容;它为实现留下了一些自由。以下是一些示例:

  • 整数类型的特定大小
  • 函数参数的求值顺序
  • 全局变量的初始化顺序

这允许每个实现在特定系统上做出最好的选择。

大多数程序都有一些未指定或实现定义的行为;这不是错误。与未定义的行为相反,这没什么问题。只是不同的实现在允许的行为集内可能会表现得略有不同。

任何表达式的任何部分的求值顺序(包括函数参数的求值顺序)均未指定(下面列出了一些例外情况)。编译器可以按任何顺序求值操作数和其他子表达式,并且可能在再次求值同一表达式时选择其他顺序。

C++ 中没有从左到右或从右到左求值的概念。不要将这与运算符的从左到右和从右到左的结合性混淆:由于运算符 + 的从左到右的结合性,表达式 a() + b() + c() 被解析为 (a() + b()) + c(),但在运行时,c() 可能首先求值、最后求值或在 a() 或 b() 之间求值:

#include <cstdio>
 
int a() { return std::puts("a"); }
int b() { return std::puts("b"); }
int c() { return std::puts("c"); }
 
void z(int, int, int) {}
 
int main()
{
    z(a(), b(), c());       // all 6 permutations of output are allowed
    return a() + b() + c(); // all 6 permutations of output are allowed
}

实验输出
在这里插入图片描述


http://www.kler.cn/a/461365.html

相关文章:

  • 网络安全靶场合集:知识点与功能解析
  • 数据可视化-1:使用Matplotlib绘制多种图表
  • 手机租赁平台开发助力智能设备租赁新模式
  • 机器学习、深度学习、神经网络之间的关系
  • (推荐)【通用业务分发架构】1.业务分发 2.rpc调用 3.Event事件系统
  • win32汇编环境下,窗口程序中生成listview列表控件及显示
  • 深度学习day6|用pytorch实现VGG-16模型人脸识别
  • 2025跨年倒计时
  • qt5.15.2+visual studio2022 免安装版环境配置
  • Elasticsearch 入门教程
  • macos 支持外接高分辩率显示器开源控制软件
  • 应急响应练习
  • WFP Listbox绑定数据后,数据变化的刷新
  • 31.九个按钮排列 C#例子 WPF例子
  • 如何在 Ubuntu 22.04 上优化 Apache 以应对高流量网站教程
  • HTML基础到精通笔记
  • GitHub Fork 和 Clone 的深度指南:操作解析与 Pull Request 完整流程20241231
  • python浅拷贝和深拷贝
  • 【每日学点鸿蒙知识】文件读写、屏幕宽度亮度、扫一扫权限、编码器问题、wlan设置
  • “库存管理软件的用户体验”:界面与交互设计