除非另有说明,否则我认为所有类型都已签名(如int
)。我很惊讶地发现,对于char
,它实际上是实现定义的:
...实现定义了char对象是否可以容纳 负值。 ......在任何特定的实现中,简单
char
object可以采用与signed char
或a相同的值unsigned char
;哪一个是实现定义的。
但std::string
实际上只是std::basic_string<char, ...>
。
这个程序的语义可以改变实现吗?
#include <string>
int main()
{
char c = -1;
std::string s{1, c};
}
答案 0 :(得分:2)
是和否。
由于std::string
包含char
类型的对象,因此类型char
的签名可能会影响其行为。
您问题中的程序:
#include <string>
int main()
{
char c = -1;
std::string s{1, c};
}
没有可见的行为(除非在没有产生任何输出的情况下终止&#34;行为&#34;),所以它的行为并不依赖于普通char
的签名。编译器可以合理地优化main
的整个主体。 (我承认在这里喋喋不休,评论你选择的代码示例而不是你问的问题。)
但是这个程序:
#include <iostream>
#include <string>
int main() {
std::string s = "xx";
s[0] = -1;
s[1] = +1;
std::cout << "Plain char is " << (s[0] < s[1] ? "signed" : "unsigned") << "\n";
}
将正确打印Plain char is signed
或Plain char is unsigned
。
请注意,使用该类型std::string
比较两个operator<
对象的类似程序不可区分普通char
是签名还是未签名,因为<
将字符视为未签名,类似于C memcmp
的工作方式。
但99%的情况下,这并不重要。您几乎肯定不得不自己编写代码,其行为取决于char
的签名。您应该记住它是实现定义的,但如果签名很重要,您应该明确地使用signed char
或(更可能)unsigned char
。 char
是一种数字类型,但您应该使用它来保存字符数据。