当前位置: 首页 > 知识库问答 >
问题:

为什么t=i“a”给出正确的输出,而t=t i“a”给出错误?

宋耀
2023-03-14

我一直在研究一些涉及将ASCII值转换为字符串的问题。

如果我使用此代码,我会以g的形式输出,这是意料之中的。

using namespace std;
int main()
{
    int i=6; vector<string> ans;
    string t= "";

    t+=i+'a';

    ans.push_back(t);
    cout<<ans[0];
    return 0;
}

但是,如果我这样更改代码:

using namespace std;
int main()
{
    int i=6; vector<string> ans;
    string t= "";

    t=t+i+'a';        // <----

    ans.push_back(t);
    cout<<ans[0];

    return 0;
}

当我尝试编译它时,会显示以下错误:

error: no match for 'operator+' (operand types are 'std::string' {aka 'std::__cxx11::basic_string<char>'} and 'int')

7 | t=t+i+'a';
  |   ~^~
  |   | |
  |   | int
  |   std::string {aka std::__cxx11::basic_string<char>}

两种代码之间的唯一区别是,在第1种代码中,我使用的是t=I‘a’ ,在秒时,<代码>t=t i“a”

有人能告诉我第二段有什么问题吗?

共有2个答案

东门城
2023-03-14

案例2中的问题是,由于运算符的优先级,语句实际上被分组为(或等效于)语句。

//---v---v--------->t is std::string while i is an int
t = (t + i) + 'a'; //equivalent to this due to operator precedence

现在,由于t是一个std::string,i是一个int,因为没有重载的操作符,它接受std::string和int,我们得到了上面提到的错误。

请注意,是一个算术运算符,因此在第一种情况下,字符文字'a'在编写i'a'时被提升为int。并且由于std::string具有重载string

壤驷泓
2023-03-14

1、t=i‘a’ 案例

在这里,有两件事很重要。第一

std::string& std::string::operator+=(char ch);

调用,它是类(即,std::basic\u字符串)的非模板成员函数

第二,i‘a’的类型是int。

一切正常,因为int类型的参数i'a'可以用作char类型的函数参数的参数。

2.t=t i'a';大小写

与案例1.相反,这里使用了运算符。首先是t i部分,其中iint类型(有关原因的详细信息,请参阅@anoopRana的回答)。但是opeartor是一个免费的(非成员)函数模板;请参阅https://en.cppreference.com/w/cpp/string/basic_string/operator+.

编译器尝试实例化此定义:

template<class CharT, class Traits, class Alloc>
std::basic_string<CharT,Traits,Alloc>
operator+( const std::basic_string<CharT,Traits,Alloc>& lhs, CharT rhs );

但不能因为:

  1. 根据类型std::string的第一个参数,CharT将被推导为char
  2. 根据int类型的第二个参数,CharT将被推导为int

因此,会发生对偶冲突。并且,没有其他模板可以实例化。

相同问题的简单演示代码:

template <typename Char>
struct String
{
    String& operator+=(Char);
};

template <typename Char>
String<Char> operator+(const String<Char>&, Char);

int main()
{
    String<char> s;
    s += 2 + 'a';
    s = s + 2 + 'a';
}

实时链接:https://godbolt.org/z/MonK1e3bq

 类似资料:
  • 我有一个关于带有三元运算符的运算符的小代码: 输出(GCC): 但在这里, 三元运算符返回type和sizeoftype是C中的字节。 那么为什么会给出四个字节的输出呢?

  • 我正在使用python 2.7。win8上的9。当我尝试使用matplotlib绘图时,出现以下错误: 从pylab导入* 绘图([1,2,3,4]) [matplotlib.lines.Line2D对象位于0x0392A9D0] 我尝试了测试代码“python simple_plot.py--verbose help”,出现了以下警告: $HOME=C:\Users\XX matplotlib数

  • 问题内容: 在我的实际项目中,这是我修改后的小程序,偶然发生。 我不知道为什么它给输出 10 吗? 之后,我放了两个零,仍然给出输出10。 然后我将 012 更改 为0123 ,现在输出83? 谁能解释为什么? 问题答案: 比我将012更改为0123,现在输出为83? 因为它被当作八进制基数(8),因为该数字的前导数字为0。因此,它对应的十进制值为10。 012: 0123:

  • 关于泛型类型,这可能是一个愚蠢的问题,但我找不到任何好的解释来解释泛型类型中遵循的命名约定。如果有一个类有两个泛型类型;Java程序员通常这样定义它: 为什么不做一些简单的事情,比如: 我只想问为什么要遵循这样的命名惯例?和背后有什么原因吗?或者这个约定来自其他语言(比如c模板)?

  • 问题内容: 我正在编写一个(貌似)简单明了的SQL代码段,该代码段在确保该列存在之后将其删除。 问题:如果列不存在,代码 内 IF子句抱怨说,它无法找到列!好了, 卫生署 ,这就是为什么它的IF子句中! 所以我的问题是,为什么不应该执行的一段代码会出现错误? 这是代码段: …这是错误: 我正在使用Microsoft SQL Server 2005 Express Edition。 问题答案: IF

  • 问题内容: 情况一: 输出: 2005年7月8日星期五00:00:00 GMT-0700(PST) 案例二: 输出: Thu Jul 07 2005 17:00:00 GMT-0700(PST) 为什么第二次解析不正确? 问题答案: 在第5版规范发布之前,该Date.parse方法完全依赖于实现(除后者返回数字而不是a之外,其他方法new Date(string)等效)。在第5版规范中,添加了该要