对本星期二的课笔记进行一个总结。
目录
三目运算符(也叫条件操作符)
格式为
exp1?exp2:exp3
#include<stdio.h>
int main()
{
int a,b,c;
scanf("%d %d %d"),&a,&b,&c);
printf("%d",(a>b?a:b)>c?(a>b?a:b):c);
return 0;
}
其中a>b?a:b表示a与b比较大小,若a>b则整段输出a到a。否则输出b到b。
后面即为a>c?a:c,即a与c比大小,输出较大的那个到%d中。
逗号表达式
int a =3;
int b =20;
int c =0;
int d =(a-=3,b+=a,c=a-b,b=a-4);
//int d =后面括号内的就是逗号表达式。
//a-=3得出a=0,b+=a也就是20加0还是10,c后面就成了-20,b得出-4。
//因此d的值为-4。
补充:
int arr[10] = {0};
arr [5] = 9;
//其中[]为下标引用操作符,操作数为数组名和下标。
int m = get max (3,5);
//其中()为函数调用操作符,操作数为函数名和3,5。
单目操作符
!
-
+
sizeof (为操作符中的运算符,并不是函数。)
~
++
--
强制类型转换
其中强制类型转换的格式为:
int main()
{
int a = 3.14; //这里改成int a = (int) 3.14;就可以把3.14强制转换为int类型。
printf("%d",a);
return 0;
}
其中++和--有以下概念:
int a = 10;
int b = ++a;
int a = 10;
int b = a++;
//++a为前置++,先++后使用,打印出来a,b都为11。
//a++为后置++,先使用后++,打印出来a=11,b=10。
关系操作符和逻辑操作符
//关系操作符:
>
>=
<
<+
!=
==
//逻辑操作符:
&&
||
int a = 3;
int b = 4'
if(a=3)&&(b=4)//两者都要为真才使用if。
if(a=3)||(b=4)//两者一个为真即可使用if。
真与假
C语言中有真与假。0代表假,1代表真。等式也存在真假。
#include<stdio.h>
int main()
{
int a=5,b=3,c=8;
int d=(a>b),e=(b>c); //a>b表达式为真,b>c表达式为假
printf("%d %d",d,e); //那么程序的运行结果是什么呢
return 0;
}
打印出来d值为1,e值为0。
int a = 0;
if(a==5) //if判断值时必须用等号,一个等号判断真假,两个才是判断相等与否。
{
printf("hehe\n");
}
注意:当if(a=0)的时候,此时a=0这一赋值表达式为假(非零即真),就不会执行后续的else语句。
若if(a=1)的时候,就可以执行后续else语句。
关键字(不能自己创建)
typedef关键字:
unsignned int num = 10;
typedef unsignned int uint
unit num2 = 10;
//现在第一句和第三句的意思完全一致了,typefed相当于把unsigned int起了一个别名。
register寄存器关键字:
register 关键字的采用范围:
1. 位于局部的,
2. 不会被写入的,
3. 读取频繁的,
4. 不会大规模使用的。
register修饰的变量,不能取地址(因为已经放在寄存区中)。
#include <stdio.h>
#include <windows.h>
int main()
{
register int a = 0;
printf("&a = %p\n", &a);
//编译器报错:错误 1 error C2103: 寄存器变量上的“&”
//注意,这里不是所有的编译器都报错,目前我们的vs2013是报错的。
system("pause");
return 0;
}
int num = 10; //4个字节。
register int num2 = 20; //建议将20放在寄存器中。
register关键字把数据存储到寄存器中来获取更快的计算速度。
static关键字(修饰变量与函数)
可以修饰全局变量,局部变量,函数。
修饰局部变量:
void test ()
{
int a = 5;
a++
printf("%d",a);
}
int main()
{
int i = 0;
while(i<10)
{ test();
i++;
}
return 0;
}
//此时输出的为6,6,6,6,6,6,6,6,6,6
//但是如果变成了static int a =5;
//你们就可以打印成6,7,8,9,10,11,12,13,14,15
因为static修饰的局部储存在静态区了。
内存有栈区,堆区和静态区。原本的a = 5存放于栈区。但是static修饰变量实际上是改变了变量的储存位置,把它放到了静态区,导致变量出了作用于仍在,生命周期没有结束。
静态区一般储存的静态变量和全局变量。栈区都是存放的局部变量和函数的参数。堆区是用于动态内存开辟的。
修饰全局变量:
int a = 2021; //另外一个中文件声明。
//如果前面有static则不能被调用。
extern int a;
int main()
{
printf("%d\n",a);
}
一个全局变量本来是具有外部链接属性的,但是被static修饰后,在外部链接属性就会变成内部链接属性。只能在当前文件使用,不能到外部源文件中使用。
static修饰函数:
int Add(int x,int y) //static int Add(int x, int y)
{
int z = x + y;
return z;
}
extern int Add(int x,int y) //extern来声明外部函数具有链接属性。
int main()
{
int a =10;
int b =20;
int ret =Add(a,b);
printf("%d\n",ret);
return 0;
}
如果为static int Add(int x,int y),则取消外部链接属性,变为内部链接属性,使函数只能在自己当前文件下使用。
sum运算
格式为如下:
#include<stdio.h>
int sum(int x,int y,int z)
{
int c;
c = x+y+z;
return c;
} //函数声明。
int main()
{
int a;
int b;
int c;
scanf("%d" "%d" "%d",&a,&b,&c); //scanf输入小数时把int改为float,scanf的%d改为%f,
printf("%d",sum(a,b,c)); //printf的%d改为%.2f就可以。
return 0;
}
或者,a,b,c有具体值时。
int main()
{
int a = 10;
int b = 20;
int c = 30;
int sum = 0; //初始化。
printf("%d",sum);
return 0;
}
宏的定义
#include<stdio.h>
int Max(int x, int y)
{
if(x>y)
return x;
else
return y;
}
#define Max(x,y) (x>y?x:y)
int main()
{
int a = 10;
int b = 20;
int max = Max(a,b);
printf("max=%d\n",Max);
return 0;
}
先抄写一遍,只是遇到了这么个解法,并没有深入了解。
复合表达式
#include<stdio.h>
int main()
{
if(4<2<3)
printf("ha");
if(4>2>3)
printf("ha");
if(4<3>2)
printf("ha");
return 0;
}
首先第一个4<2为假,输出0。0<3为真,输出1。
同理可得第二个第三个输出0。
其中<和>的结合性为从左到右,即从左往右计算。=的结合性为从右到左,但是=的优先级要低于<>。
#include<stdio.h>
int main()
{
int a, b;
if (a = b = 4)
printf("%d %d ",a,b);
if (a = 5 > 3)
printf("%d", a);
return 0;
}
第一个printf输出为4,4。而第二个printf输出为1。因为5>3等式的值为真也就是1。
!=EOF
#include<stdio.h>
int main()
{
int a=0;
while(scanf("%d",&a)!=EOF);//可以进行多行输入。
if(a>=140)
{
printf("Genius\n");
}
return 0;
}
//因为scanf函数在读取失败后回返回到EOF,因此需要写上!=EOF来排除。
//EOF全称为end of file,是文件的结束标志。
!感叹号还可以用来翻转一个等式的真假。
int x = 5;
!x即为假。
int y = 0;
!y即为真。