c++ - 替换 getchar 的返回值

标签 c++

假设我有一个由单个字符串组成的文件

a1

如果我这样写:

char ch = getchar();
char ch1 = getchar();
cout << ch - 'a'  << " " << ch1 - '0' << endl;

我在输出中有 0 1。但是如果我这样写:

cout << getchar() - 'a'  << " " << getchar() - '0' << endl;

我有 -48 49。 getchar() 不返回一个普通的字符吗?为什么结果不一样?

最佳答案

您遇到问题是因为对 getchar() 的两次调用以未指定的顺序求值,您的编译器恰好首先求值最右边的一个。

C++ 对于表达式中子表达式的求值顺序有相当宽松的规则,以提供更多的优化机会。 cout line 是一个表达式,其中保证以下内容:

  • 第一个getchar()将在第一个 - 之前进行评估
  • 第二个getchar()将在第二次之前进行评估 -
  • 第一个-将在第一个 << 之前进行评估
  • 第二个-将在第三次之前进行评估<<
  • << s 将从左开始计算。

请注意,没有其他订购限制。例如,编译器可以自由评估 getchar()电话和两个- s 在第一个 << 之前.最重要的是,没有规则强制第一个 getchar()在第二个之前进行评估。

关于c++ - 替换 getchar 的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27324729/

相关文章:

c++ - 如何使用 QTcpSocket 获取 Protobuf 发送的数据

c++ - 在 Mac 上填充菜单栏

c++ - 给定带有可变参数模板的成员函数指针的类型推导

c++ - float/double 的小范围随机数,适用于整数类型(C++、VS2010)

c++ - OpenGL - 平截头体不剔除远平面之外的多边形

c++ - 无法在 C++ 中命名 boolean 函数 "xor() "

c++ - 在 C++14 中,可恢复函数将在什么情况下执行?

一个列表的 C++ 性能

c++ - boost.spirit qi 中序列和列表运算符的属性?

c++ - 从其他类声明类类型变量会产生 C2143 错误(在 ';' 之前缺少 '*")