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语言中一些不被熟知的特性的更多相关文章

  1. JAVA语言中的修饰符

    JAVA语言中的修饰符 -----------------------------------------------01--------------------------------------- ...

  2. Java语言中的面向对象特性总结

    Java语言中的面向对象特性 (总结得不错) [课前思考]  1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类?  2. 面向对象编程的特性有哪三个?它们各自又有哪些特性?  3. 你知 ...

  3. python语言中的编码问题

    在编程的过程当中,常常会遇到莫名其妙的乱码问题.很多人选择出了问题直接在网上找答案,把别人的例子照搬过来,这是快速解决问题的一个好办法.然而,作为一个严谨求实的开发者,如果不从源头上彻底理解乱码产生的 ...

  4. 在C语言中利用PCRE实现正则表达式

    1. PCRE简介 2. 正则表达式定义 3. PCRE正则表达式的定义 4. PCRE的函数简介 5. 使用PCRE在C语言中实现正则表达式的解析 6. PCRE函数在C语言中的使用小例子 1. P ...

  5. C语言中函数声明实现的位置

    在学习C语言的时候我遇到了这么个事情,因为之前先学习的C#,在C#编译器中,函数的声明位置不会影响编译的结果,但是在C语言中却发生了错误 先看一段代码: #include <stdio.h> ...

  6. C语言中的栈和堆

    原文出处<http://blog.csdn.net/xiayufeng520/article/details/45956305#t0> 栈内存由编译器分配和释放,堆内存由程序分配和释放. ...

  7. 在易语言中调用MS SQL SERVER数据库存储过程方法总结

    Microsoft SQL SERVER 数据库存储过程,根据其输入输出数据,笼统的可以分为以下几种情况或其组合:无输入,有一个或多个输入参数,无输出,直接返回(return)一个值,通过output ...

  8. C语言中结构体赋值问题的讨论

    今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...

  9. Coursera-Getting and Cleaning Data-week4-R语言中的正则表达式以及文本处理

    博客总目录:http://www.cnblogs.com/weibaar/p/4507801.html Thursday, January 29, 2015 补上第四周笔记,以及本次课程总结. 第四周 ...

随机推荐

  1. day04 JS

    很伤心,就在前天下午,本人的电脑突然挂了,电脑售后告知需要10个工作日才可修好. 于是乎,昨天学的内容来不及整理,暂且跳过,改天再抽空补上,就当缓几天再复习吧. 今天继续学习了JS的内容. 1 js的 ...

  2. 漫谈 SLAM 技术(上)

    欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者:解洪文 导语 随着最近几年机器人.无人机.无人驾驶.VR/AR的火爆,SLAM技术也为大家熟知,被认为是这些领域的关键技术之一.本文对S ...

  3. ajax处理级联访问数据库显示

    首先创建简单的html页面,写出如下代码: 静态页相关代码: js代码:

  4. 原型模式(Prototype)

    原型模式(Prototype) 原型模式虽然是创建型的模式,但是与工程模式没有关系,从名字即可看出,该模式的思想就是将一个对象作为原型,对其进行复制.克隆,产生一个和原对象类似的新对象.本小结会通过对 ...

  5. 调用支付宝第三方接口(沙箱环境) SpringMVC+Maven

    一.蚂蚁金服开放平台的操作 网址:https://open.alipay.com/platform/home.htm 支付宝扫码登陆

  6. Mysql 的 IF 判断

    mysql自带很多判断逻辑,今天说一说IF的判断语句,正好今天做项目的时候也用到了 1. IF 判断 IF判断和我们代码里面写的有略微的差别,举个例子 IF('表达式','结果1','结果2')  如 ...

  7. SQL Server学习之路(五):“增删改查”之“改”

    0.目录 1.前言 2.通过SSMS修改数据 3.通过SQL语句修改数据 3.1 修改单列数据 3.2 修改多列数据 1.前言 增删改查都是对数据的操作,其中"改"对应的SQL语句 ...

  8. 掌握NIO,程序人生

    就像新IO为java带来的革新那样,让我们也开启一段新的程序人生. 关键字:NIO,BIO,伪IO,AIO,多路复用选择器,通道,缓冲区,jdk研究,回调函数,高并发 java.nio 概述 历史背景 ...

  9. Vue.js学习 — 微信公众号菜单编辑器(一)

    学习里一段时间Vue.js,于是想尝试着做一个像微信平台里那样的菜单编辑器,在这里分享下 具体样式代码查看项目github 创建一个vue实例 <!DOCTYPE html> <ht ...

  10. 编写高质量代码—javascript的分层—base层

    base层的功能是为common层和page层提供接口.封装不同浏览器下javaScript的差异,提供统一的接口 1.用getNextNode 函数封装IE和Firefox的差异: 2.透明度:封装 ...