忽然想到这个问题,循环变量i的做用范围。html
标准c语言不能这样定义ios
for(int i=0;i<5;i++){ printf("%d\n",i); }
编译会失败。c++
int i; for(i=0;i<5;i++){ printf("%d\n",i); } printf("%d",i); //输出5
c++中函数
#include<iostream> #include<stdlib.h> int main(int argc, char* argv[]) { int i; for(i=0;i<5;i++){ printf("%d\n",i); } printf("%d",i); //i输出为5 system("pause"); return 0; }
for(int i=0;i<5;i++){ printf("%d\n",i); } printf("%d",i); //i做做用域在for内
【背景】spa
以前就知道了有个C90和C99。.net
后来又在:code
期间知道有C11。ci
如今去整理一下,关于C语言的版本方面的更详细的内容。作用域
参考内容:
Language Standards Supported by GCC
An Introduction to GCC – for the GNU compilers gcc and g++
C语言主要有三个版本:
ANSI C standard==X3.159-1989
1989年批准经过;
1990年发布;
后被批准为ISO标准:ISO/IEC 9899:1990
常叫作:C89
偶尔被叫作:C90
GCC中指定此版本所用参数时,有三种写法:
此C90后来在1994年,1996年,前后发布过对应的勘误表;
1995年,针对以前1900年发布的标准,发布了一个修订版;
添加了一个有向图(digraphs)和宏:__STDC_VERSION__
此标准,常被叫作:AMD1
有时候被叫作:C94或C95
GCC中指定此版本时所用参数:
1999年又发布了新标准:ISO/IEC 9899:1999
常被叫作:C99
此C99标准未完成以前的草案,被叫作:C9X
GCC中指定此版本时所用参数有两种写法:
此C99后来在2001年,2004年和2007年,前后发布过对应的勘误表;
2011年发布了新标准:ISO/IEC 9899:2011
GCC中指定此版本时所用参数有两种写法:
此C11标准未完成以前的草案,被叫作:C1X
对于GCC来讲,对于上述各个版本的C语言,都有必定的扩展(extension)
若是用上面列出来的那些-std参数的话,则会禁止,不使用这些扩展的。
若是想要在GCC中使用C扩展的话,所用的参数都是gnuXX类型的,分别是:
当前C language dialect默认所用的参数是:-std=gnu90
可是当之后,GCC对于C99和C11支持程度真正完善后,则可能会换成对应的:-std=gnu99或-std=gnu11
ISO的C语言标准,定义了对于C语言的两种实现:
<float.h>,
<limits.h>,
<stdarg.h>,
<stddef.h>
AMD1对应的是:<iso646.h>
C99对应的是:<stdbool.h>,<stdint.h>
C11对应的是:<stdalign.h>,<stdnoreturn.h>
C语言的各类版本 |
主版本 |
C89 |
AMD1 |
C99 |
C11 |
别名 |
C90 ANSI C X3.159-1989 ISO/IEC 9899:1990 |
C94 C95 |
ISO/IEC 9899:1999 |
ISO/IEC 9899:2011 |
标准经过时间 |
1989年 |
|||
标准发布时间 |
1990年 |
1995年 |
1999年 |
2011年 |
GCC使用此版本所用参数 |
-ansi -std=c90 -std=iso9899:1990 |
-std=iso9899:199409 |
-std=c99 -std=iso9899:1999 |
-std=c11 -std=iso9899:2011 |
GCC使用此版本且带C扩展时所用参数 |
-std=gnu90 |
-std=gnu99 |
-std=gnu11 |
|
C语言实现时所对应函数库 |
<float.h> <limits.h> <stdarg.h> <stddef.h> |
<iso646.h> |
<stdbool.h> <stdint.h> |
<stdalign.h> <stdnoreturn.h> |
如此,就很清晰明了了。