C语言中一些不被熟知的特性
designated initializers(c99)
C99允许你对结构体中指定的变量初始化,如
struct Foo {
int x;
int y;
int z;
};
};
指定初始化也可适用于数组,如下面三个等价的数组定义
};
};
};
restricted pointers(c99)
限定词restricted用于限定一个指针(如名,告诉编译器该指针的内存访问在任何情况下都只能通过该指针进行,其余指向无效.如
int f(const int* restrict x, int* y) {
(*y)++;
int z = *x;
(*y)--;
return z;
}
会被编译器优化为
int f(const int* restrict x, int* y) {
return *x;
}
静态和限制性数组参数(c99)
]) {
/* ... */
}
编译器会warning!
又如void f(int a[const]) {
/* ... */
}
中a不可被修改。
泛型表达式(c11)
使用X Maroc(http://en.wikipedia.org/wiki/X_Macro),编译器会在compile time选择适当的形式
#define cbrt(X) _Generic((X), \
long double: cbrtl, \
default: cbrt, \
float: cbrtf \
)(X)
默认形式为cbrt(),如果实参为float就会被替换为cbrtf(),etc.
Switch条件判断case(c11)
case语句可以出现在if-else结构和循环结构中
switch (a)
{
case 1:;
// ...
if (b==2)
{
case 2:;
// ...
}
else case 3:
{
// ...
for (b=0;b<10;b++)
{
case 5:;
// ...
}
}
break;
case 4:
// ...
break;
}
不使用”+”号实现加法操作
#include <stdio.h>
int add(int a,int b){
if(a!=0&&b!=0)
return printf("%*c%*c",a,'\r',b,'\r');
else return a!=0?a:b;
}
int main(){
int A = 0, B = 0;
printf("Enter the two numbers to add\n");
scanf("%d %d",&A,&B);
printf("Required sum is %d",add(A,B));
return 0;
}
用printf()返回值实现,也可以使用bitwise实现
void返回值的函数体中使用return
static void foo (void) { }
static void bar (void) {
return foo(); // Note this return statement.
}
int main (void) {
bar();
return 0;
}
#include in strange places
#include <stdio.h>
void main()
{
printf
#include "fragment.c"
}
("dayum!\n");#text in Fragment.c
这我也无力吐槽..
有范围的switch-case(gcc extension)
switch(c) {
case 'A' ... 'Z':
Doa();
break;
case 1 ... 5 :
Dob();
}
C属于a-z字符时执行Doa();属于1-5时执行Dob();
编译器通过的最短C语言程序
main;
作者没有提到编译环境,虽然我的编译器会报错..
四个等价
a [ i ] == * (a + i) == * (i + a) == i [ a ];
古董级键盘福利
下表左右都是等价的
于是就出现这样的(:乱码code
!E() ??!??! C();
default替换(C++乱入)
#include<iostream>
int main(){
;
switch(x){
:
cout<<"1";
break;
abc1:
cout<<"2";
}
}
c++ switch-case结构中的default可以被任何标签替换,如上面的abc1
奇怪的等价
# 1 "1.c"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "1.c"
int main(){ return 0;}
等价于
#ifdef SOME_MACRO
void foo (){}
#endif
int main(){ return 0;}
且都能编译通过(其实就是预处理器- -)
C语言中一些不被熟知的特性的更多相关文章
- JAVA语言中的修饰符
JAVA语言中的修饰符 -----------------------------------------------01--------------------------------------- ...
- Java语言中的面向对象特性总结
Java语言中的面向对象特性 (总结得不错) [课前思考] 1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类? 2. 面向对象编程的特性有哪三个?它们各自又有哪些特性? 3. 你知 ...
- python语言中的编码问题
在编程的过程当中,常常会遇到莫名其妙的乱码问题.很多人选择出了问题直接在网上找答案,把别人的例子照搬过来,这是快速解决问题的一个好办法.然而,作为一个严谨求实的开发者,如果不从源头上彻底理解乱码产生的 ...
- 在C语言中利用PCRE实现正则表达式
1. PCRE简介 2. 正则表达式定义 3. PCRE正则表达式的定义 4. PCRE的函数简介 5. 使用PCRE在C语言中实现正则表达式的解析 6. PCRE函数在C语言中的使用小例子 1. P ...
- C语言中函数声明实现的位置
在学习C语言的时候我遇到了这么个事情,因为之前先学习的C#,在C#编译器中,函数的声明位置不会影响编译的结果,但是在C语言中却发生了错误 先看一段代码: #include <stdio.h> ...
- C语言中的栈和堆
原文出处<http://blog.csdn.net/xiayufeng520/article/details/45956305#t0> 栈内存由编译器分配和释放,堆内存由程序分配和释放. ...
- 在易语言中调用MS SQL SERVER数据库存储过程方法总结
Microsoft SQL SERVER 数据库存储过程,根据其输入输出数据,笼统的可以分为以下几种情况或其组合:无输入,有一个或多个输入参数,无输出,直接返回(return)一个值,通过output ...
- C语言中结构体赋值问题的讨论
今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...
- Coursera-Getting and Cleaning Data-week4-R语言中的正则表达式以及文本处理
博客总目录:http://www.cnblogs.com/weibaar/p/4507801.html Thursday, January 29, 2015 补上第四周笔记,以及本次课程总结. 第四周 ...
随机推荐
- sqli-libs
这是抄袭你们 铃兰师姐总结的,尽管她很不情愿. (现在只是第八关,相信她会努力的,一定会做完,我也会随时在这个上面更新的,这个是在本地搭建的,想要这个的可以找你们铃兰师姐要啊!!!) less-1: ...
- TFboy养成记 CNN
1/先解释下CNN的过程: 首先对一张图片进行卷积,可以有多个卷积核,卷积过后,对每一卷积核对应一个chanel,也就是一张新的图片,图片尺寸可能会变小也可能会不变,然后对这个chanel进行一些po ...
- 学习MySQL(上)
具体实例 1.PHP 服务器组件 对于初学者建议使用集成的服务器组件,它已经包含了 PHP.Apache.Mysql 等服务,免去了开发人员将时间花费在繁琐的配置环境过程. Window 系统可以使用 ...
- Codeforces543BDestory Roads心得
题目描述: In some country there are exactly n cities and m bidirectional roads connecting the cities. Ci ...
- python实战--数据结构二叉树
此文将讲述如何用python实战解决二叉树实验 前面已经讲述了python语言的基本用法,现在让我们实战一下具体明确python的用法 点击我进入python速成笔记 先看一下最终效果图: 首先我们要 ...
- CentOS7操作系统参数优化
生产环境配置需要标准化,将常用操作写成脚本用于操作系统的初始化. #!/bin/bash #Date:2017 #This Script is for centos7.3 init #01.配置yum ...
- node.js爬虫
这是一个简单的node.js爬虫项目,麻雀虽小五脏俱全. 本项目主要包含一下技术: 发送http抓取页面(http).分析页面(cheerio).中文乱码处理(bufferhelper).异步并发流程 ...
- java 之 组合模式(大话设计模式)
代码是一门艺术,每次看完大话设计模式后都会有新的认识,有时会感叹原来还可以这样玩,相信大家都用过递归,递归的使用一般遍历文件夹等会常用到, 今天讲的设计模式类似于递归,也比较神奇,先看下类图,稍后再帮 ...
- PPPOE拨号上网流程及密码窃取具体实现
楼主学生党一枚,最近研究netkeeper有些许心得. 关于netkeeper是调用windows的rasdial来进行上网的东西,网上已经有一大堆,我就不赘述了. 本文主要讲解rasdial的部分核 ...
- MySQL slave_exec_mode 参数说明
背景: 今天无意当中看到参数slave_exec_mode,从手册里的说明看出该参数和MySQL复制相关,是可以动态修改的变量,默认是STRICT模式(严格模式),可选值有IDEMPOTENT模式(幂 ...