鱼C论坛

 找回密码
 立即注册
查看: 1380|回复: 15

[吹水] 盘点C/C++中合法但很奇怪的行为

[复制链接]
发表于 2023-3-26 11:09:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

1.+++++
  1. a+++-++a
复制代码

虽然看起来很奇怪,但是根据大嘴法原则,这个的正确解析为:
  1. (a++)+(-(++a))
复制代码

不同的编译器会有不同的结果,写这个的人估计非常冲明!
《奇妙运算》

2.指向自己的指针
  1. int *a = a;
复制代码

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

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

3.指向自己的void指针
  1. void *a = *a;
复制代码

众所周知,void* 通吃所有类型,包括 void*,void***,void************************!
于是,我们可以对 a,进行 n 次的解引用,就像这样:
  1. #include <stdio.h>
  2. int main() {
  3.         void* a = &a;
  4.         printf("%d", *********************************************************************************************************************((int*********************************************************************************************************************)a));
  5. }
复制代码

得出来是一个随机无意义的数字
《超级指针》

4.Main递归
  1. #include <stdio.h>
  2. int main() {
  3.         main();
  4. }
复制代码

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

5. 最短C++/C代码
  1. main(){}
复制代码

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

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

  3. int main() {
  4.         int a[0][114514][2147483647];
  5.         printf("%d", sizeof(a));
  6. }
复制代码

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

  3. int main() {
  4.         int a[0];
  5.         printf("%d %d", sizeof(a), sizeof(a[0]));
  6. }
复制代码

sizeof(a[0]) = 4, 大于 sizeof(a)!!!
妈妈,救命啊,数组元素比数组都要大了呀~
《神奇数组》

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

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

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

评分

参与人数 2鱼币 +2 收起 理由
myd0311 + 1 鱼C有你更精彩^_^
myd0313 + 1 感谢楼主无私奉献!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-26 11:12:09 | 显示全部楼层
笑死咯
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-26 11:15:02 | 显示全部楼层
笑洗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-26 11:23:45 | 显示全部楼层
奇怪,C语言我不懂,但在python里调用自己会报RunTimeError运行超时,为啥C不会
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-26 11:23:51 | 显示全部楼层
python3:你好=5
print(你好)
5
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

评分

参与人数 1鱼币 +1 收起 理由
myd0313 + 1 无条件支持楼主!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-26 11:31:48 | 显示全部楼层
zhangjinxuan 发表于 2023-3-26 11:29
C也会报错,只不过可以抗久一点

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-27 07:18:58 From FishC Mobile | 显示全部楼层
0个元素的数组,很常见的用法啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-27 07:19:57 From FishC Mobile | 显示全部楼层
赚小钱 发表于 2023-3-27 07:18
0个元素的数组,很常见的用法啊

?????

评分

参与人数 2鱼币 +2 收起 理由
myd0311 + 1 无条件支持楼主!
myd0313 + 1 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-27 07:36:47 From FishC Mobile | 显示全部楼层
zhangjinxuan 发表于 2023-3-27 07:19
?????

咋了,至于打问号吗?确实是很常用的技巧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-27 08:57:33 From FishC Mobile | 显示全部楼层
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.

评分

参与人数 1鱼币 +2 收起 理由
赚小钱 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

学到了

评分

参与人数 1鱼币 +1 收起 理由
myd0313 + 1 无条件支持楼主!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-27 20:20:58 From FishC Mobile | 显示全部楼层
笑屎
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-3-27 20:38:28 | 显示全部楼层

最多关键字
  1. typedef struct {
  2.         protected: friend inline const volatile double b(register unsigned short int *c(void), volatile signed char *d(union b, long e)){return sizeof(nullptr);}
  3. } a;
复制代码

评分

参与人数 1鱼币 +1 收起 理由
myd0313 + 1 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-2 16:04:18 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-2 16:58:03 | 显示全部楼层
666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 10:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表