忽然想到這個問題,循環變量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> |
如此,就很清晰明瞭了。