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 ++上测试过,我得到了相同的结果.所以我相信我会错过标准定义的东西.它是什么?
以下结果让我很困惑:
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)
i3
似乎计算为(20u-80u)/2
,而不是(20-80u)/2
i3
是一样的i5
.请考虑以下代码:
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.
为什么要初始化?
我玩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)