输出:printf
c的编译器不会检测格式串中转换说明的数量和数据类型是否和后面的变量一致。转换说明的数据类型与实际数据类型不一致时,产生无意义的值。
int 类型的变量length,值为9,输出时将类型写为float或double,输出值变为0.00,毫无意义。
%f格式:用来输出实数(单精度和双精度实数),以小数形式输出。
输入:scanf
输入的变量名前加&符号,一次输入多个变量时,格式中间是空格,输入时就用空格隔开变量,输入格式中间是,时,输入两个变量中间就用,隔开。
scanf输入格式中%f是单精度浮点型,%lf是双精度浮点型。
常量
常量分为符号常量和直接常量。
符号常量需要先定义(声明),再使用,通常采用宏或const关键字定义,相当于给常量取了一个别名。
宏常量语法格式:
#define 标识符 替换列表 //注意不用;结束
#define PI 3.1415926
#include <stdio.h>
#define PI 3.1415926 //不用分号结束
int main()
{
printf("%f",PI);
}
const定义常量:
#include <stdio.h>
int main()
{
const double PI = 3.1415926;
printf("%f",PI);
}
变量:
全局变量和局部变量
在函数外定义的变量叫全局变量。
#include <stdio.h>
int i = 1; //全局变量i
int add(int a,int b)
{
int result = a + b; //局部变量result
return result;
}
int main()
{
int m = add(2,3); //result在此处不可以,从新定义一个局部变量
i++;
printf("%d\n",m);
printf("%d",i);
}
static 关键字
static可用于局部变量和全局变量,称为静态局部变量和静态全局变量。
1、静态局部变量:可以使得局部变量具有静态存储期限,即这样的局部变量在整个程序执行期间都拥有存储空间,因而变量的值一直存在。
静态局部变量仍然是局部变量,只是其存储空间不会在函数返回时被回收。
#include <stdio.h>
int add()
{
int data1 = 0;
static int data2 = 1;
data1 = data1 + 2;
data2 = data2 + 4;
return (data1 + data2);
}
int main()
{
int i = 1;
printf("NO.%d:",i);
printf("%d\n",add()); //data1 = 2, data2 = 5, 2+5=7
i = 2;
printf("NO.%d:",i);
printf("%d\n",add()); //data1 = 2 ,data2 = 9,2+9=11; data1被重写赋值0,
//data2是静态的,内存没有回收仍然是5
i = 3;
printf("NO.%d:",i);
printf("%d\n",add());
}
运行结果
2、静态全局变量
静态全局变量作用域是从变量声明的那处开始直到本文件的末尾。
存储期限是在内存空间分配之后,一直保留到程序结束。但是静态全局变量只在声明它的文件内可见,对同一文件内的函数可见,对其他文件中的函数不可见,能避免被其它文件访问,实现信息隐藏。
字符处理
#include <stdio.h>
#include <ctype.h> //字符处理需添加的头文件
int main()
{
char ch1 = 'a';
char ch2 = 'B';
char ch3 = toupper(ch1);
char ch4 = tolower(ch2);
printf("ch3 = %c\n",ch3);
printf("ch4 = %c",ch4);
}
字符输入和输出:
#include <stdio.h>
#include <ctype.h> //字符处理需添加的头文件
int main()
{
char ch1;
scanf("%c",&ch1);
printf("ch1 = %c",ch1);
}
输出: a
ch1 = a
字符输入和输出用到格式:%c,如果想强制scanf函数在读入字符时自动跳过若干空白字符,可以在%c前面加上一个空格实现。
#include <stdio.h>
#include <ctype.h> //字符处理需添加的头文件
int main()
{
char ch1;
scanf(" %c",&ch1);
printf("ch1 = %c",ch1);
}
scanf的格式中%C前面添加了空格,所以输入:空格空格a,输出是a。
c语言还提供另外一对函数:getchar()和putchar()函数,实现对单独的一个字符进行读写操作。
#include <stdio.h>
#include <ctype.h> //字符处理需添加的头文件
int main()
{
char ch1;
// scanf(" %c",&ch1);
// printf("ch1 = %c",ch1);
ch1 = getchar(); //输入一个字符,返回输入的字符
putchar(ch1); //输出一个字符
}
getchar函数不支持格式化输入,要想在读入字符时,跳过若干空白字符,通常借助循环结构实现。
bool类型
bool类型在C99之后才有,值是true和false,并且存储成int类型,true记录成1,false记录成0.
使用bool类型需要添加<stdbool.h>头文件。
#include <stdio.h>
#include <stdbool.h> //bool类型需要添加这个头文件
int main()
{
bool b = 1;
bool m = 6 > 5;
bool n = (6==5);
printf("b = %d\n",b);
printf("m = %d\n",m);
printf("n = %d\n",n);
}
逻辑运算
逻辑运算是至左向右的元素,如果左边的结果已经能够决定结果了,就不会做右边的运算。
a == 6 && b==1;
对于&&运算,左边的是false,右边的就不运算了。
对于||运算,左边的是true,右边的就不运算了。
#include <stdio.h>
int main()
{
int a = -1;
if(a > 0 && a++ > 1){
printf("OK\n");
}
printf("a = %d\n",a);
}
因为a>0是false,所以if语句的判断结果一定是false,a++>1无需执行,所以a = -1。
运算符优先级:
所有关系运算低于算术运算,高于赋值运算。
7 >= 3+4; //3+4=7,7>=7结果是1
6>5>4 //6>5结果是1 ,1>4结果是0