在C++中循环字符时出现意外结果

Tou*_*zen 2 c++ cout char post-increment

我正在使用"使用C++编程原理和练习"一书来学习编程,其中一个练习是使用while循环遍历字符az.

现在,我之前用C++和其他语言编程,所以我决定尝试使用尽可能少的行(同时仍然使用while循环).然而,这与我的输出成本有点混乱.

码:

#include <iostream>
int main(){
    char ch = 'a';
    while(ch <= 'z')
        std::cout << ch << '\t' << (int) ch++ << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

b   97
c   98
d   99
e   100
...
x   119
y   120
z   121
{   122
Run Code Online (Sandbox Code Playgroud)

现在我意识到这可以用for-loop完成,而且我也做了(它工作).但我仍然不知道这段代码有什么问题,这真让我烦恼.

看起来好像我告诉它输出"ch + 1",因为它打印出'b',它应该打印'a'.直到将ch的整数值放入流出后(后递增)之后才进行递增.即使我之前增加了它,至少打印的字符及其整数值应该对应.

有什么想法为什么这个代码不起作用?

Lig*_*ica 5

operator<<调用的顺序是明确指定的,但是它们的操作数的计算顺序不是.

ch可能在输出ch"第一次" 之前或之后发生增量,并且由于交错的读/写操作,仅运行此程序仍然是未定义的:

[2003: 1.9/12]:全表达为不是另一种表达的子表达式的表达式.[..]

[2003: 1.9/16]:每个完整表达式的评估完成时都有一个序列点.

[2003: 5/4]:除非另有说明,否则单个运算符的操作数和单个表达式的子表达式的评估顺序以及副作用发生的顺序是未指定的.在前一个和下一个序列点之间,标量对象应通过表达式的计算最多修改其存储值一次.此外,只能访问先前值以确定要存储的值.对于完整表达式的子表达式的每个允许排序,应满足本段的要求; 否则行为未定义.


相反,要明确:

std::cout << ch << '\t' << int(ch) << std::endl;
++ch;
Run Code Online (Sandbox Code Playgroud)

您的编译器应该已经警告过您的代码.它并不表示您没有将诊断设置设置为有用的级别.

使用GCC,使用-Wall -Wextra -std=c++98 -pedantic(或-Wall -Wextra -std=c++0x -pedantic用于C++ 0x).