一些小众的C语言知识点,可能会比较有趣或者怪异,分享给大家看一下。

1. 数组下标

C语言中访问数组元素一般都写成:

arrayName[index]

但其实也可以写成:

index[arrayName]

请看下面的代码:

#include <stdio.h>
int main(void){int arr[5] = {1, 2, 3, 4, 5};printf("%d\n", 2[arr]);return 0;
}

运行结果:

3

2. 符号替换

早期 IBM 在计算机产业中的地位非常重要,但是它的键盘没有中括号和花括号按键,所以在C语言中可以使用其它的组合符号来替代,并且一直保留到现在。

我们可以使用<::>来代替[],使用<%%>来替换{}

例如,下面的代码是可以正常编译运行的:

#include <stdio.h>
int main(void)
<%int arr<:5:> = {1, 2, 3, 4, 5};printf("%d\n", 2<:arr:>);return 0;
%>

3. 趋近运算符

C语言有一种“趋近运算符”,写作-->或者<--,可以让一个变量的值逐渐趋近于某个数字。

请看下面的代码:

#include <stdio.h>
int main(void){int x = 10;do{printf("%d ", x);}while(0<--x);return 0;
}

运行结果:

10 9 8 7 6 5 4 3 2 1

其实,这不过是假象罢了,趋近运算符只是一种奇巧淫技而已。

<--可以拆分成两个运算符,分别是小于运算符<和自减运算符--,而--的优先级大于<,所以先执行--,再执行<

while 循环中的正确逻辑如下:

  • x 先自减 1;
  • 判断 x 是否大于 0;
  • 回到 do 循环体打印 x。

4. 字符串拼接

将两个由" "包围的字符串放在一起,它们会自动拼接成一个字符串,请看下面的代码:

#include <stdio.h>
int main(void){const char* str = "C "  "C++"  "Python";puts(str);return 0;
}

运行结果:
C C++ Python

""包围的字符串默认是不能换行的,如果文本内容比较长,你可以使用\来换行。请看下面的代码:

#include <stdio.h>
int main(void){const char* str = "C is the foundation. \
C++ C + + is a C-based extension. \
Python is a scripting language.";puts(str);return 0;
}

运行结果:
C is the foundation. C++ C + + is a C-based extension. Python is a scripting language.

注意,\必须放在当前行的末尾。

5. long 不一定比 int 长

C语言有三种基本的整数类型,分别是 short、int、long,很多初学者认为,后者的长度大于前者的长度,这个其实是不对的。

C语言并没有严格规定 short、int、long 的长度,只做了宽泛的限制:

  • short 至少占用 2 个字节。
  • int 建议为一个机器字长。32 位环境下机器字长为 4 字节,64 位环境下机器字长为 8 字节。
  • short 的长度不能大于 int,long 的长度不能小于 int。

所以它们的长度(所占字节数)关系为:

2 ≤ short ≤ int ≤ long

这就意味着,short 并不一定真的”短“,long 也并不一定真的”长“,它们有可能和 int 占用相同的字节数。

在 16 位环境下,short 的长度为 2 个字节,int 也为 2 个字节,long 为 4 个字节。16 位环境多用于单片机和低级嵌入式系统,在PC和服务器上已经见不到了。

对于 32 位的 Windows、Linux 和 Mac OS,short 的长度为 2 个字节,int 为 4 个字节,long 也为 4 个字节。PC和服务器上的 32 位系统占有率也在慢慢下降,嵌入式系统使用 32 位越来越多。

在 64 位环境下,不同的操作系统会有不同的结果,如下所示:

操作系统 short int long
Win64(64位 Windows) 2 4 4
类Unix系统(包括 Unix、Linux、Mac OS、BSD、Solaris 等) 2 4 8

目前我们使用较多的PC系统为 Win 7、Win 10、Win 11、Mac OS、Linux,在这些系统中,short 和 int 的长度都是固定的,分别为 2 和 4,大家可以放心使用,只有 long 的长度在 Win64 和类 Unix 系统下会有所不同,使用时要注意移植性。

6. 1Byte 不一定等于 8Bit

人们通常认为 1Byte 等于 8Bit,就好像公理一样,但其实C语言标准并没有这样说。

C语言标准只是规定一个 Byte 必须能够以正数的方式容纳整个 ASCII 编码表,但是具体实现还要依赖编译器。虽然理论上不会出现 1Byte=7Bit 这种情况,但是说不好哪天有个脑袋进水的家伙搞出来一个编译器,规定 1Byte=9Bit。

可以通过 CHAR_BIT 这个宏来获得当前编译环境的字节长度,如下所示:

#include <stdio.h>
#include <limits.h>int main(void){printf("%d", CHAR_BIT);return 0;
}

END

今天的分享到此结束了,如果在编程学习的路上遇到问题,不妨来我的编程学习交流基地一起来学习探讨

C/C++编程学习基地https://jq.qq.com/?_wv=1027&k=2pJWtP1j

C语言有哪些冷知识?相关推荐

  1. C语言的一些有趣的冷知识

    C语言的一些有趣的冷知识 c语言的各种有趣的Tips(不断更新) 1."New B"之后是C语言 2.在函数这一层面extern是冗余的 3.sizeof是一个运算符 4.空格不是 ...

  2. c语言 switch_switch硬核别致玩法,C语言冷知识,领略认知盲区的switch写法

    前言 本文主要介绍的是C语言中switch的别样玩法,这是很多学习C语言的人基本都没有见过的一个冷知识,虽然不是很常用,但是希望对于广大读者学习C语言有一些帮助. switch别致源码展示 如果你是第 ...

  3. c语言结构体世界杯,世界杯冷知识 | 12座球场的结构巡礼

    原标题:世界杯冷知识 | 12座球场的结构巡礼 2018世界杯开赛一周,32只球队都已亮相完毕(有些球队在买回家机票了?),同时12座赛场也都和大家见过面了,也许专(he)心(jiu)看(lu)球(c ...

  4. Java语言中的生僻知识

    最近有一首名叫<生僻字>的流行歌曲火遍大江南北,创作者给佶屈聱牙的生僻字,配上了优美明快的旋律,竟然让歌曲变得琅琅上口.悦耳动听起来,平时不太常见的拒人于千里之外的这些汉字也不再那么陌生, ...

  5. ppt文件限打开次数_PPT冷知识25条!看到第一条我就翻了车…

    嗨,各位木友们好呀,我是小木. 作为P圈非著名老司机,木哥专职做PPT已经快有五年时间了. 说一句闻者伤心.见者不孕不育的话: 我遇过的PPT崩溃的次数,可能比你打开PPT的次数还要多. 然而,即使我 ...

  6. web前端的易错点和冷知识,新人必看!

    都记录一些有关前端方面的冷知识或者一些易踩坑点,防止大家踩坑. JavaScript 所有对象都有 proto 属性,都指向创造对象的函数对象的 prototype. 上传文件要使用 formdata ...

  7. 不看会后悔的100个超有趣冷知识(一)

    ------------------------------------多图预警------------------------------------------ 记事本冷知识 1.如何让记事本卡住 ...

  8. c 传递流java 生僻字_Java语言中的生僻知识

    最近有一首名叫<生僻字>的流行歌曲火遍大江南北,创作者给佶屈聱牙的生僻字,配上了优美明快的旋律,竟然让歌曲变得琅琅上口.悦耳动听起来,平时不太常见的拒人于千里之外的这些汉字也不再那么陌生, ...

  9. 分享几个有趣实用的冷知识,涨知识了

    苏生不惑第377 篇原创文章,将本公众号设为星标,第一时间看最新文章. 今天分享几个让你涨知识的冷知识. 身份证号码的X 之前详细介绍过身份证号码的由来身份证号码的秘密  ,号码最后一位Ⅹ表示罗马数字 ...

  10. IT冷知识--每日一练

    目录 一.IT冷知识--每日一练 战火中的程序员 讽刺的名字 爱,死亡和机器人 浏览器的新时代 C++ 的类型是什么? <纸牌屋>是谁制作的? 盖茨的游戏梦 第一次冒险 铭记一生的悲剧 蠕 ...

最新文章

  1. ROS系统中实现点云聚类(realsense数据源)
  2. 相机标定 matlab opencv ROS三种方法标定步骤(1)
  3. Ubuntu 和 Redhat / Fedora 服务管理命令对比表(附Fedora16新的服务管理工具systemctl )...
  4. [Ubuntu] ubuntu10.04系统维护之Wine的安装
  5. ibatis mysql 自增_mybatis自增主键
  6. c++ pdflib输出表格_DescrTab2包,输出SCI级别的描述统计表
  7. oracle批量构造数据,oracle批量构造数据方法 - rd_clp的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  8. Web流程图绘制使用raphael
  9. eclipse导入工程报错解决
  10. Tensorflow ExponentialMovingAverage 详解
  11. sql以什么开头怎么写_如果让你给自己的人生写一个开头,你会怎么写?
  12. pgAgent couldn't get a connection to the database!
  13. go.mod 文件中的 //indirect
  14. android省市区三级联动,NumberPicker实现省市区三级联动的效果
  15. VoLTE前台信令详析及注释说明
  16. electron 打开选择文件框
  17. 关键点检测——无监督
  18. 区块链超级记帐本架构概览
  19. 从清华-哈佛外科论坛,看未来可期的最新医疗科技动向
  20. 互联网晚报 | 以岭药业声明网传“连花清瘟防疫方”不实;​如果不能自负盈亏,马化腾称整个腾讯新闻砍掉都可以;小米卢伟冰继任总裁...

热门文章

  1. Spark worker内存不足导致任务失败,报错Likely due to containers exceeding thresholds, or network issues
  2. termux python 打开摄像头_python+opencv 电脑调用手机的摄像头
  3. 使用CNN进行情感分析(Sentiment Analysis)
  4. android 正三角,倒三角的实现代码
  5. STM32F103_study69_The punctual atoms(STM32 SPI communication principle and configuration)
  6. Visual Studio.net 2003 安装和卸载的教训(包括软件下载地址及安装方法)
  7. python flask豆瓣微信小程序案例
  8. SQL中的comment语法
  9. 硬件信息查看PHP,如何查看电脑硬件信息|查看电脑硬件信息软件 查看电脑CPU/显卡/内存条/主板型号等配置...
  10. 英语微课-Speaking Confidently