1,环境centos7.4,查看是否有gcc编译器
gcc -v
结果:
Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper Target: x86_64-redhat-linux Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=sr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootsap --enable-shared --enable-threads=posix --enable-checking=release --with-sysm-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-uniquobject --enable-linker-build-id --with-linker-hash-style=gnu --enable-languagec,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-aay --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x864-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-201502/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-ne=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux Thread model: posix gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)
补充:
GCC(GNU Compiler Collection,GNU编译器套件) 是由GNU开发的编程语言译器。 GNU编译器套件包括C、C++、 Objective-C、 Fortran、Java、Ada和Go语言前端, 也包括了这些语言的库(如libstdc++,libgcj等。)
2,实例:
#include <stdio.h> int main() { /* hello C 程序 */ printf("Hello, World! "); return 0; }
程序主要结构:
结构概述: 预处理器指令 函数 变量 语句 & 表达式 注释 第一行 #include <stdio.h> 是预处理器指令,告诉 C 编译器在实际编译之前要包含 stdio.h 文件。 下一行 int main() 是主函数,程序从这里开始执行。 下一行 /*...*/ 将会被编译器忽略,这里放置程序的注释内容。它们被称为程序的注释。 下一行 printf(...) 是 C 中另一个可用的函数,会在屏幕上显示消息 "Hello, World!"。 下一行 return 0; 终止 main() 函数,并返回值 0。
3,操作
在home目录中创建my_c目录并创建一个hello.c文件将上面代码放入:
cd /home
mkdir my_c
cd my_c
。。。
vim hello.c
:wq
编译执行
gcc hello.c //编译后,默认生成a.out文件 ./a.out //执行生成的文件 Hello, World! //输出结果
补充:设置编译后的文件名称:
gcc hello.c -o hello.out //编译后的文件设置为hello.out
另一种写法:gcc -o hello.out hello.c
./ hello.out //执行 还可以将多个源码编译成指定的名称的文件 gcc test1.c test2.c -o main.out
补充:上面的编译其实包括:编译和链接
宏观编译干了啥:源码转换为二维码。 包括词法分析、语法分析、语义分析、性能优化、生成可执行文件五个步骤 实际分为两部分:编译和链接 编译: C语言代码经过编译以后,并没有生成最终的可执行文件(.exe/.out 文件), 生成了一种叫做目标文件(Object File)的中间文件又叫对象文件(临时文件)。 目标文件也是二进制形式的,它和可执行文件的格式是一样的。 (但只是将我们自己写的代码变成了二进制形式) 对于 Visual C++,目标文件的后缀是.obj; 对于 GCC,目标文件的后缀是.o。 链接: 与系统组件(比如标准库、动态链接库等)组合起来。 链接(Link)其实就是一个“打包”的过程, 它将所有二进制形式的目标文件和系统组件组合成一个可执行文件。 完成链接的过程也需要一个特殊的软件,叫做链接器(Linker)。 总结: 编译是针对一个源文件的,有多少个源文件就需要编译多少次,就会生成多少个目标文件。 编译器每次只能编译一个源文件,生成一个目标文件, 这个时候,链接器除了将目标文件和系统组件组合起来, 还需要将编译器生成的多个目标文件组合起来。
可以通过-c指明不链接编译
1,将1.c文件不链接编译: gcc -c 1.c //将输出1.o文件, 2,进行链接和直接编译成可执行一样: gcc 1.o //默认输出a.out 3,指定输出文件名称: gcc -o 1.out 1.o
4,数据类型
在Linux中32位和64位系统的(long相关的)一些类型占用的字节不一样(Windows一样)
可以通过函数sizeof查看类型占用字节大小,例子:
#include <stdio.h> #include <limits.h> int main() { printf("int 存储大小 : %lu ", sizeof(int)); return 0; } 输出: int 存储大小 : 4
补充:printf函数
特别是函数的前段参数说明:比如: "int 存储大小 : %lu ":这是一串将直接输出的字符串 特殊的两部分需要注意: %开头的占位符,这个占位符还能设置输出值的格式 %lu 为 32 位无符号整数 开头的转义符 输出结果后换行
归纳:
1 常用基本数据类型占用空间(64位机器为例) 2 char : 1个字节 3 int :4个字节 4 float:4个字节 5 double:8个字节 6 7 基本类型书写 8 整数 9 a,默认为10进制 ,10 ,20。 10 b,以0开头为8进制,045,021。 11 c.,以0b开头为2进制,0b11101101。 12 d,以0x开头为16进制,0x21458adf。 13 14 小数 15 单精度常量:2.3f 。 16 双精度常量:2.3,默认为双精度。 17 18 字符型常量 19 用英文单引号括起来,只保存一个字符'a'、'b' 、'*' ,还有转义字符 ' ' 、' '。 20 21 字符串常量 22 用英文的双引号引起来 可以保存多个字符:"abc"。 23 24 1、数据类型转换: 25 C 语言中如果一个表达式中含有不同类型的常量和变量,在计算时,会将它们自动转换为同一种类型; 26 在 C 语言中也可以对数据类型进行强制转换; 27 28 2、自动转换规则: 29 a)浮点数赋给整型,该浮点数小数被舍去; 30 b)整数赋给浮点型,数值不变,但是被存储到相应的浮点型变量中; 31 3、强制类型转换形式: (类型说明符)(表达式)
5,声明和定义
6,常量
常量包括:整数常量,浮点常量,字符常量,字符串常量
定义常量:
在 C 中,有两种简单的定义常量的方式: 使用 #define 预处理器。 使用 const 关键字。
#define 预处理器定义常量的形式:
#define identifier value 特点:不用像java那样去指明类型,也不用等号赋值。
例子:
#include <stdio.h> #define LENGTH 10 #define WIDTH 5 #define NEWLINE ' ' //换行符 int main() { int area; area = LENGTH * WIDTH; printf("value of area : %d", area); printf("%c", NEWLINE); return 0; }
结果:
value of area : 50
const 前缀声明指定类型的常量
const type variable = value; 貌似和java一样。
例子:
#include <stdio.h> int main() { const int LENGTH = 10; const int WIDTH = 5; const char NEWLINE = ' '; int area; area = LENGTH * WIDTH; printf("value of area : %d", area); printf("%c", NEWLINE); return 0; }