【发布时间】:2016-10-03 12:57:29
【问题描述】:
我写的是this answer,引用自http://en.cppreference.com/w/cpp/string/byte/tolower#Parameters
不能表示为 unsigned char 且不等于 EOF,行为未定义
当我去查看the edit that had added this phrase时发现作者的评论:
根据 C99 7.4/1,任何 ctype.h 函数都不能使用负符号字符
作者引用了 C++ 文档中的 C99 标准。那有效吗?我在 C++ 标准中找不到关于这个函数的定义的任何内容,所以我必须假设它是有效的。
但这有两个原因让我担心:
- 我如何知道 C++ 标准所依赖的 C 标准版本?
- 有the discrepancies between C and C++ everywhere 的列表。如果我参考 C++ 查看 C 标准,我怎么可能知道我正在查看的区域是否已被覆盖?
【问题讨论】:
-
FWIW,第一个描述“不能表示为 unsigned char ...”是对 C99 和 C11 要求的非常接近的解释。作者的评论“不能使用负无符号字符......”是错误的(更不用说自相矛盾了)。很抱歉让事情变得混乱;我第一次没有仔细阅读你的问题。
-
哎呀,错误地引用了第二条评论:它是“负符号字符”,而不是“负无符号字符”。然而,“负符号字符”是完全错误的,因为不能表示为有符号字符的负值也是被禁止的,因为
EOF很可能可以表示为负符号字符。 -
相关的,如果不是重复的话:stackoverflow.com/a/34308279/2003898
-
@PeteBecker 这是我的提交评论,我指的是 \xb4 我用它更改为未签名(同时还添加了对 UB 的提及)。但是,是的,它不够迂腐。
标签: c++ c dependencies standards language-lawyer