未定义行为

有符号数字加减乘除越界

例题:输入两个int范围内的数字,判断加法后是否越界
if (a > 0 && b > 0 && (a + b < 0))

无符号数字没有问题

LeetCode的编译器对未定义行为检查非常严格,如果出现未定义行为就是Runtime Error

int 溢出 是 undefined behavior
unsigned 溢出 不是 undefined behavior

2**31 - 1 的二进制是
01111111 11111111 11111111 11111111

1
00000000 00000000 00000000 00000001

10000000 00000000 00000000 00000000
这个数字在 int 下是
-2147483648

简单题:
输入自然数a和b,判断a+b是否越界

数组越界

int a[64], b[64];
a[64] = ..;

同一句话中修改两次

++i + ++i + ++i

同时修改和使用一个变量

x = f[x] = f[f[x]]

这句话在 C++ 和 Python 中,运行结果不一样

int F(int x)
{
	while (f[x] != x)
	{
		x = f[x] = f[f[x]]
	}
}

x^=y^=x^=y^=x

左右移超过位数,左右移负数位数

函数不写 return

  1. 未定义行为
    1. 有符号数字加减乘除越界
    1. 数组越界
    2. 同一句话中修改两次
    3. 同时修改和使用一个变量
    4. 左右移超过位数,左右移负数位数
    5. 函数不写 return