cbrt c语音_C语言有哪些鲜为人知的特性?

本文由 伯乐在线 - Lingfeng Ai 翻译自 Quora。未经许可,禁止转载!

欢迎加入:技术翻译小组,或分享原创到伯乐头条。

译注:本文摘编自 Quora 的一个热门问答贴。 请在linux系统下测试本文中出现的代码

switch语句中的case 关键词可以放在if-else或者是循环当中

1. 声明紧随用途之后

理解声明有一条很简单的法则,不过不是什么“从左向右”这种没道理却到处宣传的法则。这一法则的观点是,一个声明是要告诉你,你所声明的对象要如何使用。例如:

2. 指定初始化:

在C99之前,你只能按顺序初始化一个结构体。在C99中你可以这样做:

这段代码首先初始化了foo.z,然后初始化了foo.x. foo.y 没有被初始化,所以被置为0。

这一语法同样可以被用在数组中。以下三行代码是等价的:

3. 受限指针(C99):

restrict关键词是一个限定词,可以被用在指针上。它向编译器保证,在这个指针的生命周期内,任何通过该指针访问的内存,都只能被这个指针改变。比如,在

编译器可能会假设,x和y 所指的并不是同一个int对象,因为如果它们指向了同一个对象,则x的值将可以通过y修改,这正是你保证不会发生的。因此,将允许编译器来优化f,就好像函数原本被写做如下这样:

如果你违反协议向f传递两个指向同一int对象的指针时,将产生未定义行为。

我猜想,引入这一特性最初的动机之一是想让C语言在数值计算时可以Fortran一样快。在Fortran 中,默认假定数组不会重叠,因此只有你通过restrict 限定词来显式的告诉编译器数组不能重叠,编译器才能在C语言中进行这样的优化。

4. 静态数组索引(C99)

中,你向编译器保证,你传递给f 的指针指向一个具有至少10个int 类型元素的数组的首个元素。我猜这也是为了优化;例如,编译器将会假定a 非空。编译器还会在你尝试要将一个可以被静态确定为null的指针传入或是一个数组太小的时候发出警告。

你不能修改指针a.,这和说明符int * const a.作用是一样的。然而,当你结合上一段中提到的static 使用,比如在int a[static const 10] 中,你可以获得一些使用指针风格无法得到的东西。

5. 泛型表达式(C11)

这个表达式会在编译期间根据控制表达式的类型,在一个含有一个或多个备选方案的集合中做出选择。下面这个例子可以很好的说明这一切:

因此,如果expr 是long double类型的, cbrt(expr) 被转换为cbrtl(expr),如果是float类型 则转换为cbrtf(expr) ,或是转换为cbrt(expr),如果是其他不同的类型(比如说double )。注意,_Generic 可以用在宏以外的地方,但是用在宏里面最好因为C不允许你进行函数重载。

6. wint_t (C99)

我相信大家都知道wint_t 但是 wint_t 到底是个什么鬼东西呢?

好吧,记住fgetc 实际上并不会返回 char 。它会返回int。显然这是因为fgetc 必须返回返回一个与其他char 都不同的值,也就是EOF,表示到达文件末尾。基于相同的原因,fgetwc 并不返回wchar_t。它会返回一个类型,叫做wint_t 可以表示所有无效wchar_t 类型,包括WEOF,来表示到达文件末尾。

下面这段C程序可以准确的打印2的747次方而不产生误差。这是为什么呢?

程序:

输出结果:

答案:

这个问题包含两个部分。

其一,2的次方可以在double 中被准确的保存而不产生任何精度上的损失(这一结论直到2^1023都是对的,再往后就会产生上溢,得到一个正无穷的值)

另外一部分,很多人猜测是语言实现中的某些特殊情况导致的,但是实际上并非如此。的确,当输入的数据可以被2的某高次方整除时,有一部分代码被执行了,但是本质上这只是通常实现工作时的一个副作用。基本上,printf 在打印数字(任何类型)的时候只是做了从二进制到十进制的转换。并且由于结果对于浮点数可能会过大,printf 的内部实现包含和使用一个大整型实现,尽管在C中并没有大整型这种变量(在gcc源代码中,vfprintf.c 和dtoa.c 中包含了很多转换,如果你想要了解可以一看。)

如果你尝试打印3^474,

程序:

输出结果:

结果仍然是一个很大的数且位数也正确,但是这一次却不够精确。这里会产生一个相对误差,因为3^474不能以双精度浮点数准确的表示。准确的数应该是这样的143045676882846603471…

译注:在linux系统上是可以的,在windows 64位上后面会有很多0

我发现一些C语言特性或者是小技巧,我觉得只有很少的人知道。

1. 不使用加号来使数字相加

因为printf() 函数返回它所打印的字符的个数,我们可以利用这一点来使数字相加,代码如下:

利用位操作同样也可以做到:

2. 条件运算符的用法

通常我们都这样使用它:

x = (y < 0) ? 10 : 20;

但是同样也可以这样用:

(y < 0 ? x : y) = 20;

3. 在一个返回值为void 的函数中写一个return 语句

4. 逗号表达式的使用

通常逗号表达式会这样使用:

但是你可以在其他任何地方使用逗号表达式:

每条语句都进行了求值,但是表达式的值是最后一个语句的值。

5. 将结构体初始化为0

struct mystruct a = {0};

这将把结构体中全部元素初始化为0

6. 多字符常量

int x = 'ABCD';

这会把x的值设置为0×41424344(或者0×44434241,取决于架构)

7. printf 允许你使用变量来格式化格式说明符本身

* 符号可以达到这一目的

希望这些可以帮助到大家

此致敬礼

你可以在奇怪的地方使用#include

如果你写:

且fragment.c 包含:

这完全没有问题。只要#include 包含完整可解析的C表达式,预处理器并不在意它放在什么位置。

1. printf 格式限定符中指定(POSIX扩展语法)

printf("%4$d %3$d %2$d %1$d", 1, 2, 3, 9); //将会打印9 3 2 1

2. 在scanf 中忽略输入输入

scanf("%*d%d", &a);// 如果输入1 2,则只会得到2

3. 在switch 中使用范围(gcc扩展语法)

4. 使用前缀ob 来限定常数,使其被当做二进制数(gcc扩展语法)

5.完全正确的最短的C语言程序

译注:虽然编译没有error但是却不能执行

scanf()的力量

假定我们有一个数组char a[100]

读取一个字符串:

scanf("%[^\n]\n", a);//表示一直读取直到遇到'\n',并且忽略掉'\n'

读取字符串直到遇到逗号:

scanf("%[^,]", a);//但是这次不会忽略逗号

如果你想忽略掉某个输入,使用在% 后使用*,如果你想要得到John Smith 的姓:

顺便提一句,你应该非常小心的使用scanf 因为它可能会是你的输入缓冲溢出!通常你应该使用fgets 和sscanf 而不是仅仅使用scanf,使用fgets 来读取一行,然后用sscanf 来解析这一行,就像上面演示的一样。

~-n 等于n-1

-~n 等于n+1

原因:

当我们写-n时,实际上是以补码形式储存,所以-n 可以写成~n + 1,吧整个式子放在上面表达式的前面你就能明白原因了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/523581.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QString中文字符串中指定字符的查找

中文字符串指定字符查找场景示例运行环境示例代码代码讲解难点重点场景 在一个QString类型的中文字符串中查找一个指定的中文字符串&#xff0c;找到该指定的中文字符串后&#xff0c;返回其找到的下标位置&#xff0c;判断下标位置向前一位的字符是否为指定的字符。 示例 运…

强强联手 SAP Ariba与苏宁易购共建中国企业智慧采购

2019年5月30日&#xff0c;南京讯— SAP Ariba&#xff08;采购云&#xff09;联合苏宁易购共同宣布达成战略合作关系&#xff0c;苏宁易购成为SAP Ariba Spot Buy&#xff08;零星采购&#xff09;业务在中国大陆地区的合作伙伴。双方将利用SAP与苏宁集团的全业态资源&#xf…

Lombok快速入门

Lombok快速入门 文章目录一、Lombok介绍&#xff1a;1.1 Lombok优点&#xff1a;1.2 lombok 依赖引入1.3 lombok 插件安装二、常用注解2.1 Getter and Setter2.2 ToString2.3 EqualsAndHashCode2.4 NoArgsConstructor2.5 AllArgsConstructor2.6 Slf4j2.7 Builder、2.8 Data2.92…

图片夹_各种变调夹的优缺点、原理和使用方法

变调夹(capo)是吉他弹奏中很重要的一部分&#xff0c;演奏者可以用它来很方便的调整吉他的音调&#xff0c;在民谣弹唱中&#xff0c;如果吉他为标准调弦(EADGBE)&#xff0c;当弹唱比较常见的D调的歌曲如《成都》时&#xff0c;只需用变调夹夹在二品&#xff0c;演奏者就可以用…

double类型的变量与0的对比

double类型变量与0比较概述实现double类型概述 日常总是会遇到double类型变量与0之间的比较。非严格情况下直接与0比较了&#xff0c;但实际上这是一种错误的写法。double为双精度类型&#xff0c;其一般保留15为小数。而Flaot单精度类型一般保留6为小数。故而不能直接与0进行…

朋友,你实现荔枝自由了吗? | Alfred数据室

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;作者&#xff1a; AlfredWu转自&#xff1a;Alfred数据室Alfred已经有四年没有在广东生…

tomcat9控制台中文乱码

1、找到${CATALINA_HOME}/conf/logging.properties2、找到java.util.logging.ConsoleHandler.encoding UTF-83、 修改为java.util.logging.ConsoleHandler.encoding GBK 3、重启tomcat。

一个事物两个方面的对比举例_作比较的句子大全简短-对比的句子什么比什么重要-什么和什么做比较的句子...

对比是修辞方法,就是把两种不同事物或者同一事物的两个不同方面放在一起相互比较的一种辞格。 对比的句子你能举出两个这样的例子吗?这样写有什幺好 鳕鱼一次产卵竟达千万粒,真正能变成幼鱼的卵可能还不到1%。 列数字:准确,有科学根据 打比方:天上的星星像一颗颗宝石。 作…

idea控制台输出乱码

2分钟搭建企业轻量级负载均衡服务器 文章目录1. 修改配置文件2. tomcat启动参数&#xff1a;3. 统一编码格式1. 修改配置文件 打开IntelliJ IDEA本地安装目录中bin文件夹下的idea.exe.vmoptions和idea64.exe.vmoptions这两个文件 分别在这两个文件内容的末尾添加&#xff1a;…

数据可视化图表,你选对了吗?

戳蓝字“CSDN云计算”关注我们哦&#xff01;Photo by Jason Coudriet on Unsplash文 | 邻川来源 | 阿里巴巴中间件程序员懂画图&#xff0c;一宝变三宝。继上期「阿里程序员小技巧」中&#xff0c;阿里巴巴技术专家三画分享了他关于《如何画好架构图》的经验&#xff0c;本期&…

使用IDEA 1分钟搭建运行SpringMVC项目

使用IDEA 1分钟搭建运行SpringMVC项目 文章目录一、项目搭建1.1. 新建项目1.2. 选择maven项目构建1.3. 设置组织名和模块名称1.4 . 选择本地maven仓库1.5 . 项目名和存放的位置1.6 . 开启自动下载依赖1.7. 搭建项目完成&#xff01;&#xff01;&#xff01;二、项目运行2.1. 显…

ARM 发布新一代 CPU 和 GPU,实现 20% 性能提升!

戳蓝字“CSDN云计算”关注我们哦&#xff01;整理 | 郭芮出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;作为全球知名的芯片设计企业&#xff0c;ARM 踩着一年一度即将开幕的台北电脑展&#xff08;Computex 2019&#xff09;热潮推出了新一代产品。据外媒 Ventur…

Git仓库初始化_企业级开发原则

Git仓库初始化_企业级开发原则 文章目录1. 在远程github创建仓库2. 在本地创建README.md测试WIKI文件3. 创建.gitignore文件4. 初始化git仓库5. 工作区变更文件添加至暂存区6. 文件提交至本地仓库7. 连接远程仓库8. 将本地仓库变更文件推送至远程9. 开发原则分支开发&#xff0…

python student类_9.Python类和对象

9.1 类(class)面向对象最重要的概念就是类(Class)和实例(Instance)&#xff0c;类是抽象的模板以Student类为例&#xff0c;在Python中&#xff0c;定义类是通过class关键字class后面紧接着是类名&#xff0c;即Student&#xff0c;类名通常是大写开头的单词&#xff0c;紧接着…

Unix风雨五十年:老兵远去,新秀崛起

戳蓝字“CSDN云计算”关注我们哦&#xff01;文 | 姜洪军Unix?这是多老的一个传说啊!年轻一代的很多人似乎都没听说过。不过&#xff0c;微软的Windows NT、开源的Linux、谷歌的安卓、苹果的iOS&#xff0c;大家不陌生吧&#xff1f;其实这些都带着Unix的基因&#xff0c;我们…

Mybatisplus代码生成 之SpringBoot适配MYSQL和ORACLE

Mybatisplus代码生成 之SpringBoot适配MYSQL和ORACLE 文章目录前期准备&#xff1a;看图操作&#xff0c;一路下一步1. 导入相关依赖2. 新建代码生成类MysqlGenerator2.1. MYSQL 代码生成部分2.2. ORACLE代码生成部分3. 创建全局配置文件4. 启动类加MapperScan注解5. 在control…

360浏览器网页走丢了_超酷!Win10 正式版全新 UI 界面,全球第二大浏览器上线...

5月10日消息&#xff0c;微软今年首个 Windows 10 正式版将捆绑并换上全新的 Edge 浏览器&#xff0c;目前微软已向预览通道用户推送了 KB4559309 独立更新补丁&#xff0c;该补丁更新后将自动替换旧版 Edge 浏览器。撰文&#xff5c;XL科技说此前微软曾确认今年首个 Windows 1…

MP 启动注入 SQL 原理分析

MP 启动注入 SQL 原理分析 文章目录一、MybatisPlus需要sql语句吗&#xff1f;解答&#xff1a;需要1.1. 问题&#xff1a;为什么MybatisPlus看不到sql语句&#xff1f;1.2. 分析&#xff1a;继承关系1.3. 假设&#xff1a;操作数据库一定有sql二、通过现象看本质2.1. 测试案例…

虚拟化精华问答 | 为什么云计算需要虚拟化?

虚拟化是一种资源管理技术, 是将计算机的各种物理资源, 如服务器、网络、内存及存储等&#xff0c;予以抽象、转换后呈现出来&#xff0c;打破物理设备结构间的不可切割的障碍&#xff0c;使用户可以比原本的架构更好的方式来应用这些资源。这些资源的虚拟部分是不受现有资源的…

c++ raiseexception产生异常_Day17_异常,线程

《Java自学180天笔记》异常分类package demo3;/*java.lang.Throwable:类是Java语言中所有错误或异常的超类。 Exception:编译期异常&#xff0c;进行编译(写代码)java程序出现的问题 RuntimeException&#xff1a;运行期异常&#xff0c;java程序运行过程中出现的问题…