我遇到了这段代码:
std::string str;
std::getline(std::cin, str);
std::string sub = str.substr(str.find('.') + 1);
Run Code Online (Sandbox Code Playgroud)
第一反应是 - 这是无效的代码.但经过一些想法似乎并不那么简单.那么它是有效的C++表达式(具有可预测的行为)吗?
PS如果不是那么清楚问题主要与'.'时会发生什么有关.不会被发现str,但不限于此,因为可能存在其他问题.
我有这个代码,这两个计算给了我不同的结果。
第一个溢出,第二个只保留 2^31-1。
我不明白为什么。
int n4, n5;
n4 = pow(2, 31);
n4 = n4 + n4;
n5 = pow(2, 31) + pow(2, 31);
printf("\nn4: %d, n5: %d",n4,n5);
/* n4: -2, n5: 2147483647 */
Run Code Online (Sandbox Code Playgroud) 我正在将一些Go代码移植到Rust,我意识到在乘法过程中发生溢出时Rust会慌乱,而Go允许溢出发生。
下面的测试代码不会引起溢出,但是会打印出减少的值。(通过以下网址测试:https : //play.golang.org/)
func main() {
fmt.Println("test\n")
var key uint64 = 15000;
key = key*2862933555777941757 + 1
fmt.Println(key)
}
Run Code Online (Sandbox Code Playgroud) 我一直认为下一个例子是未定义的行为(访问数组越界):
int main()
{
int* a= new int[3];
a[0] = 100;
a++;
unsigned long index = 0;
printf("%d\n", a[-1]);
printf("%d\n", a[index - 1]);
printf("%ul\n", index - 1);
}
Run Code Online (Sandbox Code Playgroud)
然而,这个输出很好:
100
100
4294967295l
Run Code Online (Sandbox Code Playgroud)
为什么下标运算符不会发生下溢?
#include <iostream>
using namespace std;
int main() {
unsigned char char_values[2] = {0, 255};
char_values[1] += 1;
cout << (int)char_values[0] << endl;
cout << (int)char_values[1] << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这段代码中,我预计:
1
0
Run Code Online (Sandbox Code Playgroud)
因为十进制中的255是二进制中的1111 1111而十进制中的255 + 1是二进制中的1 0000 0000.所以我认为因为溢出char[0]会受到影响,char[1]但结果是:
0
0
Run Code Online (Sandbox Code Playgroud)
溢出会影响其他变量吗?
为什么编译没有错误呢?我究竟做错了什么?
#include <stdio.h>
int main (){
int n1 = 90, n2 = 93, n3 = 95;
int i = 2147483647;
int ii = 2147483646;
int iii = 2147483650;
char c1[50] = {'\0'};
char c2[50] = {'\0'};
char c3[50] = {'\0'};
n1 = sprintf(c1, "%d", i+i);
n2 = sprintf(c2, "%d", ii);
n3 = sprintf(c3, "%d", iii);
printf("n1 = %d, n2 = %d, n3 = %d\n i = |%s| \n ii = |%s|\niii = |%s|\n", n1, n2, n3, c1, c2, c3);
return …Run Code Online (Sandbox Code Playgroud)