Day 4 初识C语言 12.15

对本星期二的课笔记进行一个总结。

 目录

三目运算符(也叫条件操作符)

逗号表达式

补充:

单目操作符

关系操作符和逻辑操作符

 真与假

关键字(不能自己创建)

typedef关键字:

register寄存器关键字:

static关键字(修饰变量与函数)

sum运算

宏的定义

复合表达式

!=EOF

!感叹号还可以用来翻转一个等式的真假。

三目运算符(也叫条件操作符)

格式为

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即为真。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值