替换 getchar 的返回值
subsructing getchar's return value
>假设我有一个由单个字符串组成的文件
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
行是一个表达式,其中保证以下内容:
- 第一个
getchar()
将在第一个-
之前进行评估 - 第二个
getchar()
将在第二个-
之前进行评估 - 第一个
-
将在第一个<<
之前进行评估 - 第二个
-
将在第三个<<
之前进行评估 <<
S 将按左侧的顺序进行评估。
请注意,没有其他订购限制。例如,编译器可以自由地计算getchar()
调用和第一个<<
之前的-
。最重要的是,没有规则强制在第二个getchar()
之前评估第一个。
相关文章:
- 从python中调用C++函数并获取返回值
- 为什么模板类中的对象不能返回值
- 返回值优化:显式移动还是隐式
- lock_guard是否保护返回值
- 调用CreateProcess()并获取字符串的返回值
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 查找 GCD:并非所有控制路径都返回值
- 在 Arduino 上使用 sscanf 会导致与 const char * 不匹配,并且返回值始终相同,尽管输入值不同
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 如何从 std::thread 返回值
- 将返回值从 exe 传递到 bat,并将其传递给 C# 中的进程
- 方法错误"not all control paths return a value"和方法不返回值
- 如何读取 C++ SAFEARRAY**,该 SAFEARRAY** 是 COM 互操作的结果,其中 C# 返回值为
- 对fread的返回值感到困惑
- 程序不向函数返回值
- 如何在另一个函数中使用返回值作为参数?
- 如何使用 uint64_t 键类型从 std::map<int, std::string> 返回值?
- 6031:在Visual Studio 2019中忽略了返回值(getchar())
- 替换 getchar 的返回值