C语言标准格式
//#include这行代码是一条C预处理指令,相当于把stdio.h文件中所有内容都输入到该行所在位置
//实际上是一种复制粘贴
//stdio.h-->标准输入输出头文件 standard input output
#include<stdio.h>
//从main函数开始执行
int main(void) //标准写法
{
//可以用大小写字母、数字和下划线来命名,首字符必须是字母或者下划线
int num = 1;
printf("Number is %d \n",num);
return 0;
}
一个标准的C程序格式如下:
#inlcude<stdio.h>
int main(int argc,char*[] argv)
{
语句
return 0;
}
argc、argv的具体含义
argc和argv参数在用命令行编译程序时有用。main( int argc, char* argv[], char **env ) 中
第一个参数,int型的argc,为整型,用来统计程序运行时发送给main函数的命令行参数的个数,在VS中默认值为1。
第二个参数,char*型的argv[],为字符串数组,用来存放指向的字符串参数的指针数组,每一个元素指向一个参数。各成员含义如下:
argv[0]指向程序运行的全路径名
argv[1]指向在DOS命令行中执行程序名后的第一个字符串
argv[2]指向执行程序名后的第二个字符串
argv[3]指向执行程序名后的第三个字符串
argv[argc]为NULL
第三个参数,char ** 型的env,为字符串数组。env[]的每一个元素都包含ENVVAR=value形式的字符串,其中ENVVAR为环境变量,value为其对应的值。平时使用到的比较少。
作为接口的main()函数
通常,main()被启动代码调用,启动代码是由编译器添加到程序中的,是程序和操作系统的桥梁。该函数头描述的是main()和操作系统之间的接口。运行C++程序时,通常是从main函数开始执行的,如果没有main函数,程序将不完整。但也有例外情况,如在Windows编程中,编写一个动态链接库(DLL)模块,用于专用环境的程序–如机器人的控制器芯片,可能不需要main函数。
声明变量
int carrots;
该语句提供了两条信息:需要的内存,以及该内存单元的名称。声明通常指出了要存储的数据类型和程序对存储在这里的数据使用的名称,该声明语句叫做定义声明,简称定义,这意味着编译器为变量分配内存空间。
对于声明变量,在C中所有变量的声明通常位于函数或者过程的开始位置;C++的做法是尽可能在首次使用变量前声明它。
printf("a:%d,%d,%d",2)
//输出结果:a:2,9389856,9376608
printf("a:%d,%d,%d",2,3,4,5);
//输出结果:a:2,3,4
待打印值少于转换说明:打印出来的是内存中的任意值
多出来的则不打印
进制
十进制:%d
八进制:%o
十六进制:%x
如果是小写的x,输出的字母就是小写的;如果是大写的X,输出的字母就是大写的;如果加一个#,就以标准的十六进制形式输出
如果要显示进制的前缀,则需在**%后加上#**符号:
十进制:%#d
八进制:%#o
十六进制:%#x
二进制 Binary
八进制 Octal
十进制 Decimal
十六进制 Hexadecimal
# include <stdio.h>
int main(void)
{
int i = 47;
printf("%#d\n", i);//47
printf("%#o\n", i);//057
printf("%x\n", i);//2f
printf("%X\n", i);//2F
printf("%#x\n", i);//0x2f
printf("%#X\n", i);//0X2F
return 0;
}
类型大小
关键字 sizeof
sizeof是C语言内置运算符,以字节为单位给出指定类型的大小
返回类型为size_t,使用%zd转换说明,一些不支持C99和C11的编译器可以用%u或%lu代替。
各个类型的变量长度由编译器来决定(实际上与操作系统位数和编译器都有关)使用时可用sizeof()得到,当前主流编译器一般是32位或64位。
字节:byte;位:bit
1byte=8bit
类型 | 32位(字节) | 64位(字节) | 范围 |
---|---|---|---|
char | 1 | 1 | |
bool | 1 | 1 | |
short int | 2 | 2 | -32768 ~ 32767;(即-2^ 15 - 2 ^15-1) |
int | 4 | 4 | -2147483648 ~ 2147483647;(即-2^31 ~ 2 ^31-1) |
long int | 4 | 8 | |
long long int | 8 | 8 | |
char*(指针类型) | 4 | 8 | |
float | 4 | 4 | |
double | 8 | 8 |
16位操作系统:long:4字节,int:2字节
32位操作系统:long:4字节,int:4字节
64位操作系统:long:8字节,int:4字节
注意:在win10+vs2017环境下:
实测数据如下:
64位:
sizeof int 4
sizeof double 8
sizeof long 4
sizeof long long 8
sizeof char 1
sizeof float 4
sizeof 指针 8
32位:
sizeof int 4
sizeof double 8
sizeof long 4
sizeof long long 8
sizeof char 1
sizeof float 4
sizeof 指针 4
long类型始终是4字节大小,至于网上说的在64位环境中的大小为8字节,是否考虑与编译器有关?还有待考证。
C语言规定:无论什么平台都要保证long型占用字节数不小于int型, int型不小于short型。
注:指针类型存储是指所指向变量的地址,32位机只需32 bit,64位机需要64 bit
字符和字符串
字符串是一个或多个字符的序列,都被储存在char类型的数组中,数组末尾以 \0 结尾。
字符串常量 “X” 和字符常量 ‘X’ 不同:
- ‘X’ 的基本类型为char,而"X"是派生类型(char 数组)
- "X"实际上是由两个字符组成的:‘X’ 和空字符 \0
sizeof 运算符以字节为单位给出对象的大小;strlen()函数给出字符串中的字符长度。
#define PRAISE "You are an ectraordinary being."
printf(" %d letters",strlen(PRAISE));//31
printf(" %d btyes\n",sizeof PRAISE);//32
printf()和scanf()
printf()
转换说明
- %a :浮点数,十六进制和p计数法
- %A
- %c 单个字符
- %d 、%i 有符号十进制整数
- %md m 为指定的输出字段的宽度。如果数据的位数小于 m,则左端补以空格,若大于 m,则按实际位数输出
- %e、%E 浮点数,e计数法
- %f 浮点数,十进制计数法
- %.mf 输出实数时小数点后保留 m 位,注意 m 前面有个点。
- %g、%G 根据值的不同,自动选择%f或%e。%e格式用于指数小于-4或者大于等于精度时。
- %o 无符号八进制整数
- %x、%X 无符号十六进制整数,使用十六进制数0f、0F。
- %p 指针
- %s 字符串
- %u 无符号十进制数
- %% 打印一个%
printf()中的修饰符
- 标记 (-、+、空格、#和0),可以使用多个标记
- 数字 最小字段宽度,该字段不能容纳待打印的数字或字符串,系统会使用更宽的字段。
- .数字 小数点后的数字表示精度,对于%e、%E和%f转换,表示小数点右边数字的位数。对于%g和%G,表示有效数字的最大位数;对于%s,表示打印字符的最大数量。对于整形转换,表示待打印数字的最小位数。,如果有必要,使用前导0来达到这个位数。
printf()中的标记
- ‘-’ 代打印项左对齐
- ‘+’ 有符号值若为正,则在前面显示加号;若为负,则显示减号。
- 空格 有符号值若为正,则在值前面显示前导空格(不显示任何符号);若为负,则在值前面显示减号,+标记覆盖一个空格
- ‘#’ 把结果转换为另一种形式。如果是%o格式,则以0开始,如果是%x或%X则以0x或0X开始;
- 对于所有浮点格式,#保证了即使后面没有任何数字,也打印一个小数点字符。对于%g和%G格式,防止结果后面的0被删除。
- 0 对于数值格式,用前导0代替空格填充字段宽度。对于整数格式,如果出现‘-’标记或者指定精度,则忽略该标记。
printf()的返回值:返回打印字符的个数。
scanf()
- 如果用scanf()读取基本变量的值,在变量名前加上一个&
- 如果是把字符串读入字符数组中,不需使用&
scanf()的返回值
返回成功读取的项数
int num = scanf("%d,%d,%d,%d",&a,&b,&c,&d);//num=4
如果没有任何读取项,且需要读取一个数字而用户却输入一个非数值字符,scanf()便返回0。当检测到“文件结尾”时,会返回EOF(EOF是stdio.h中定义的特殊值,通常用#define指令把EOF定义为-1)
printf()的 * 修饰符
可通过程序来动态指定字段宽度和浮点值的精度
scanf("%d %d",&width,&precision);
printf("Weight = %*.*f\n",width,precision,weight);
scanf()的*修饰符
把*放在%和转换字符之间,会使得scanf()跳过相应的输出项
scanf("%*d,%*d,%d",&n);//1,2,3
printf("%d\n",n);//3
C语言的多重赋值
int a,b,c,d;
a=b=c=d=222;
除法运算符的 截断
整数除法和浮点数除法不同。浮点数除法结果是浮点数,整数除法结果是整数。整数是没有小数部分的数。
printf("%d\n",5/4);
printf("%f\n",5.0/4);//混合类型,浮点数/整数。结果是浮点数,一般情况要避免使用混合类型。
printf("%f\n",5/4);
printf("%f\n",5./4.);
结果:
1
1.250000
0.000000
1.250000
递增递减符号使用规则
如果一个变量出现在一个函数的多个参数中,或者多次出现在一个表达式中,不要使用递增或递减运算符。