zhangjinxuan 发表于 2023-3-26 11:09:27

盘点C/C++中合法但很奇怪的行为

本帖最后由 zhangjinxuan 于 2023-7-8 21:51 编辑

1.+++++
a+++-++a
虽然看起来很奇怪,但是根据大嘴法原则,这个的正确解析为:
(a++)+(-(++a))
不同的编译器会有不同的结果,写这个的人估计非常冲明!
《奇妙运算》

2.指向自己的指针
int *a = a;
这是合法的,读到 int *a 就已经为 a 开辟空间了,结果后面来一个 = a,但编译器不知情,就只能强行赋值了

只不过,这个值恒为 0,也就是 (void*)0
《指向自己》

3.指向自己的void指针
void *a = *a;
众所周知,void* 通吃所有类型,包括 void*,void***,void************************!
于是,我们可以对 a,进行 n 次的解引用,就像这样:
#include <stdio.h>
int main() {
        void* a = &a;
        printf("%d", *********************************************************************************************************************((int*********************************************************************************************************************)a));
}
得出来是一个随机无意义的数字
《超级指针》

4.Main递归
#include <stdio.h>
int main() {
        main();
}
栈里面本没有溢出,递归的次数多了,也便溢出了.....
虽然合法,编译通过,但,这操作有点……
不过在 debug 程序的时候,你想输入多组数据,又不想改代码,也不想一直输入./a.out(或按f10),加一个 main(),就能输入多组数据啦?
《调用自己》

5. 最短C++/C代码
main(){}
解释:大部分编译器中,没有返回值的函数会自动返回 signed int,而碰巧 main 就必须是 signed int 类型,于是,就这样,成功运行了
可是
但凡它有点用,也不至于这么没用!
《最短代码》

6. 0个元素的数组
#include <bits/stdc++.h>
using namespace std;

int main() {
        int a;
        printf("%d", sizeof(a));
}
这个 a 有什么用?第一维是 0,后面一切都空谈好吧!
sizeof(a) = 0,这比什么都没有的结构体更废,好吧!
更离谱的是:
#include <bits/stdc++.h>
using namespace std;

int main() {
        int a;
        printf("%d %d", sizeof(a), sizeof(a));
}
sizeof(a) = 4, 大于 sizeof(a)!!!
妈妈,救命啊,数组元素比数组都要大了呀~
《神奇数组》

7. 不管怎样,必须得有一个“特别”的数字
我们打 oi 的时候,要开数组
我们开数组的时候,一定要遵守以下法则:
n <= 10000,数组大小 10086
n <= 100000,数组大小 114514 ?
n <= 1000000,数组大小 1919810 ???
n <= 2000000,数组大小 3141592 !
n <= 5000000,数组大小 5201314 !!!!!!
《数字专家》

大家还有什么让人不理解的操作吗?欢迎回帖分享~

例如:
typedef struct {
        protected: friend inline const volatile double b(register unsigned short int *c(void), volatile signed char *d(union b, long e)){return sizeof(nullptr);}
} a;

歌者文明清理员 发表于 2023-3-26 11:12:09

笑死咯

元豪 发表于 2023-3-26 11:15:02

笑洗{:10_250:}{:10_250:}{:10_250:}

沙漠之烟 发表于 2023-3-26 11:23:45

奇怪,C语言我不懂,但在python里调用自己会报RunTimeError运行超时,为啥C不会{:10_257:}

sfqxx 发表于 2023-3-26 11:23:51

python3:你好=5
print(你好)
5

zhangjinxuan 发表于 2023-3-26 11:29:24

沙漠之烟 发表于 2023-3-26 11:23
奇怪,C语言我不懂,但在python里调用自己会报RunTimeError运行超时,为啥C不会

C也会报错,只不过可以抗久一点

沙漠之烟 发表于 2023-3-26 11:31:48

zhangjinxuan 发表于 2023-3-26 11:29
C也会报错,只不过可以抗久一点

赚小钱 发表于 2023-3-27 07:18:58

0个元素的数组,很常见的用法啊

zhangjinxuan 发表于 2023-3-27 07:19:57

赚小钱 发表于 2023-3-27 07:18
0个元素的数组,很常见的用法啊

?????

赚小钱 发表于 2023-3-27 07:36:47

zhangjinxuan 发表于 2023-3-27 07:19
?????

咋了,至于打问号吗?确实是很常用的技巧。

dolly_yos2 发表于 2023-3-27 08:57:33

zhangjinxuan 发表于 2023-3-27 07:19
?????

确实是比较常见的用法,比如用来放在将会动态分配其占用空间的结构的结尾来实现变长数组
然而这是一个编译器扩展,而非 C 标准写法。标准要求(对指定数组长度的表达式)
If the expression is a constant expression, it shall have a value greater than zero. […] If the size is an expression that is not an integer constant expression: […] each time it is evaluated it shall have a value greater than zero.

zhangjinxuan 发表于 2023-3-27 12:47:21

dolly_yos2 发表于 2023-3-27 08:57
确实是比较常见的用法,比如用来放在将会动态分配其占用空间的结构的结尾来实现变长数组
然而这是一个编 ...

学到了{:10_277:}

高山 发表于 2023-3-27 20:20:58

笑屎

zhangjinxuan 发表于 2023-3-27 20:38:28

高山 发表于 2023-3-27 20:20
笑屎

最多关键字{:10_279:}
typedef struct {
      protected: friend inline const volatile double b(register unsigned short int *c(void), volatile signed char *d(union b, long e)){return sizeof(nullptr);}
} a;

元豪 发表于 2023-4-2 16:04:18

zhangjinxuan 发表于 2023-3-27 20:38
最多关键字

{:10_275:}

额外减小 发表于 2023-4-2 16:58:03

666
页: [1]
查看完整版本: 盘点C/C++中合法但很奇怪的行为