为何Stroustrup在PPP第二版称char不支持++运算符?实际测试可用
C中char类型的/--运算符支持问题
我在Stroustrup所著《C编程原理与实践》(Programming Principles and Practice Using C,简称PPP)第二版的「常用类型的实用运算符」表格中看到,char类型不支持++运算符,但实际测试发现并非如此,因此有以下疑问:
测试代码与运行结果
我编写了一段测试代码验证char的自增自减行为:
#include <iostream> using namespace std; int main() { char ch=24; cout << "Enter ch: "; cin >> ch; cout << "ch: " << ch << endl; ch=ch+1; cout << "ch + 1: " << ch << endl; ch++; cout << "ch++: " << ch << endl; ch--; cout << "ch--: " << ch << endl; return 0; }
使用g++ 12.2.0-14编译运行,输入字符'g'后得到结果:
$ g++ 2.cpp $ ./a.out Enter ch: g ch: g ch + 1: h ch++: i ch--: h $ g++ --version g++ (Debian 12.2.0-14) 12.2.0 Copyright (C) 2022 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
从结果可见,char类型可以正常使用++、--运算符。
核心疑问
- C11和C14标准是否支持char类型的++、--运算符?
- 为何Stroustrup会做出char不支持该运算符的表述?
解答
关于标准支持
C11和C14标准完全支持char类型使用++(自增)和--(自减)运算符。
在C++标准中,char属于算术类型(signed char、unsigned char、char都是整数类型的子集),而自增/自减运算符的适用范围明确包含所有可修改的左值算术类型,因此char类型在语法上天然支持这些运算符,你的测试结果也符合标准规定。
关于书中表述的可能原因
书中的表述大概率是存在歧义或笔误,而非标准层面的事实,常见的可能性有两种:
- 语义层面的建议而非语法限制:Stroustrup可能想强调,当char作为「字符语义」使用时(比如存储字母、符号),并非所有场景下的自增/自减都有合理的业务意义(比如对非字母字符自增可能得到无意义的结果),因此不建议滥用这种写法,但这并不代表语法上不支持。
- 早期教学语境的遗留表述:在C的早期教学资料中,有时会为了区分「字符类型」和「整数类型」的语义差异,刻意弱化char的算术运算特性,但从C98开始,标准就明确了char的算术类型属性,C++11/14自然延续了这一规则。
内容的提问来源于stack exchange,提问作者fedya
相关产品推荐
相关产品推荐

