奇妙的玄学

1、有符号数和无符号数条件判断时的坑

有点意思,5居然不大于-5,是编译器傻了吗?不,这是因为,当有符号数与无符号数进行条件判断时,编译器会自动将有符号数隐式转化为无符号数,这时,-5就会变成一个极大的无符号整数,所以造成了逻辑判断上的错误。 当然,如果直接取两者的运算结果的话,结果还是正确的。 所以,当进行条件判断时,一定要注意条件运算符两端的数值的数据类型,以免造成判断上导致的流程错误,这错误可能是致命的。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char ch[0x20] = "";
    //printf("%d %d\n", sizeof(ch), strlen(ch));

    char *p = (char *)malloc(-1);
    printf("%p %lu\n", p, sizeof(p));

    int a = -5;
    unsigned int b = 5;
    printf("int a = -5, uint b = 5\n");
    if (a > b) {
        printf("a大于b\r\n");
    } else {
        printf("a不大于b\r\n");
    }

    // 这个判断不应该有问题吧
    if (a > 0 && a > b) {
        printf("a大于b\r\n");
    } else {
        printf("a不大于b\r\n");
    }

    if (a <= 0) {
        printf("a不大于b\r\n");
    } else if (a > b) {
        printf("a大于b\r\n");
    } else {
        printf("a小于b\r\n");
    }

    char c = 'G';
    char str[] = "hankin";
    printf("%c\n", str[-1]);
    return 0;
}


(nil) 8
int a = -5, uint b = 5
a大于b
a不大于b
a不大于b
空

2、代码中malloc分配-1时未崩溃

返回NULL,即0。

3、代码中发现是可以访问数组下标为-1不崩溃

并不是返回上一个地址的值。

results matching ""

    No results matching ""