小编Leo*_*Lai的帖子

std :: string + =运算符不能传递0作为参数

std::string tmp;
tmp +=0;//compile error:ambiguous overload for 'operator+=' (operand types are 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}' and 'int')
tmp +=1;//ok
tmp += '\0';//ok...expected
tmp +=INT_MAX;//ok
tmp +=int(INT_MAX);//still ok...what?
Run Code Online (Sandbox Code Playgroud)

第一个认为传递整数作为参数,对吗?为什么其他人通过编译?我在Visual C++和g ++上测试过,我得到了相同的结果.所以我相信我会错过标准定义的东西.它是什么?

c++ stdstring

37
推荐指数
2
解决办法
2031
查看次数

有符号和无符号之间的减法,然后是除法

以下结果让我很困惑:

int i1 = 20-80u;    // -60
int i2 = 20-80;     // -60
int i3 =(20-80u)/2; // 2147483618
int i4 =(20-80)/2;  // -30
int i5 =i1/2;       // -30
Run Code Online (Sandbox Code Playgroud)
  1. i3似乎计算为(20u-80u)/2,而不是(20-80u)/2
  2. 据说i3是一样的i5.

c++ unsigned arithmetic-expressions integer-overflow

25
推荐指数
2
解决办法
1485
查看次数

是否初始化了std :: map中原始类型的值?

请考虑以下代码:

map<int,int> m;
for(int i=0;i<10000;++i) m[i]++;
for(int i=0;i<10000;++i) printf("%d",m[i]);
Run Code Online (Sandbox Code Playgroud)

我认为打印出的值是未定义的,因为原始类型没有默认构造函数,但是每次测试时我都得到10000个1.

为什么要初始化?

c++ stdmap primitive-types

11
推荐指数
2
解决办法
879
查看次数

Tricks编译器用于编译128位整数的基本算术运算

我玩GodBolt看x86-64 gcc(6.3)编译以下代码:

typedef __int128_t int128_t;
typedef __uint128_t uint128_t;

uint128_t mul_to_128(uint64_t x, uint64_t y) {
  return uint128_t(x)*uint128_t(y);
}
uint128_t mul(uint128_t x, uint128_t y) {
  return x*y;
}
uint128_t div(uint128_t x, uint128_t y) {
  return x/y;
}
Run Code Online (Sandbox Code Playgroud)

我得到了:

mul_to_128(unsigned long, unsigned long):
        mov     rax, rdi
        mul     rsi
        ret
mul(unsigned __int128, unsigned __int128):
        imul    rsi, rdx
        mov     rax, rdi
        imul    rcx, rdi
        mul     rdx
        add     rcx, rsi
        add     rdx, rcx
        ret
div(unsigned __int128, unsigned __int128):
        sub     rsp, 8
        call    __udivti3 //what is this??? …
Run Code Online (Sandbox Code Playgroud)

c++ assembly gcc x86-64 compiler-optimization

2
推荐指数
1
解决办法
419
查看次数