1、(1)求和
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int m=0;
int n=0;
scanf("%d%d",&m,&n);
int sum=m+n;
printf("%d\n",sum);
return 0;
}
(2)利用函数求和
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int add(int a,int b)
{
int c=0;
c=a+b;
return c;
}
int main()
{
int x=0;
int y=0;
scanf("%d%d",&x,&y);
int z=add(x,y);
printf("%d\n",z);
return 0;
}
2、数组
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
int arr[11] = { 0,1,2,3,4,5,6,7,8,9,10 };
char ch[5] = { 'a','b','c' }; //不完全初始化,剩余默认为0
int i = 0;
while (i < 11)
{
printf("%d ", arr[i]);
i++;
}
printf("\n");
i = 0;
while (i < 5)
{
printf("%c ", ch[i]);
i++;
}
return 0;
}
3、操作符
(1)算术操作符
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int m = 10 / 3;
float n = 10 / 3;
float p = 10 / 3.0;
int q = 10 % 3;
printf("%d\n", m);
printf("%f\n", n);
printf("%f\n", p);
printf("%d\n", q);
return 0;
}
(2)移位操作符
初始时,变量a被初始化为3,其二进制表示为 0000 0011。
右移一位表示将二进制数向右移动一位,空出的位置用0填充。移位后得到的结果为 0000 0001,转换为十进制即为1。
左移一位表示将二进制数向左移动一位,空出的位置用0填充。移位后得到的结果为 0000 0110,转换为十进制即为6。
对于有符号整数的右移操作,根据C语言标准规定,实施右移操作时,对于正数,用0填充空出的位置,对于负数,用1填充空出的位置。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a=3;
int b=a>>1;
int c=a<<1;
printf("%d\n",a);
printf("%d\n",b);
printf("%d\n",c);
return 0;
}
(3)位操作符
& 按位与:
【这个操作符会将两个数的二进制形式进行“与”操作,如果两个相应的二进制位都是1,则该位的结果值为1,否则为0。例如:
int a = 60; // 60 = 0011 1100
int b = 13; // 13 = 0000 1101
int c = a & b; // c = 0000 1100 = 12
在这个例子中,a和b的二进制表示分别是0011 1100和0000 1101。当这两个二进制数进行按位与操作后,结果为0000 1100,这正是12的二进制表示。】
| 按位或:
【这个操作符会将两个数的二进制形式进行“或”操作,如果两个相应的二进制位中有一个是1,则该位的结果值为1,否则为0。
例如:
cint a = 60; // 60 = 0011 1100
int b = 13; // 13 = 0000 1101
int c = a | b; // c = 0011 1101 = 61
在这个例子中,a和b的二进制表示分别是0011 1100和0000 1101。当这两个二进制数进行按位或操作后,结果为0011 1101,这正是61的二进制表示。】
^ 按位异或:
【这个操作符会将两个数的二进制形式进行“异或”操作,如果两个相应的二进制位不同,则该位的结果值为1,否则为0。
例如:
cint a = 60; // 60 = 0011 1100
int b = 13; // 13 = 0000 1101
int c = a ^ b; // c = 0011 0001 = 49
在这个例子中,a和b的二进制表示分别是0011 1100和0000 1101。当这两个二进制数进行按位异或操作后,结果为0011 0001,这正是49的二进制表示。】
(4)赋值操作符号
=:赋值运算符,将右边的值赋给左边的变量。例如:int a = 5;,这表示将5赋值给变量a。
+=:加等于运算符,将左边的值与右边的值相加,并将结果赋值给左边的变量。例如:int a = 5; a += 3;,这表示将a的值为5,然后加上3,再将结果8赋值给a。
-=:减等于运算符,将左边的值与右边的值相减,并将结果赋值给左边的变量。例如:int a = 5; a -= 3;,这表示将a的值为5,然后减去3,再将结果2赋值给a。
*=:乘等于运算符,将左边的值与右边的值相乘,并将结果赋值给左边的变量。例如:int a = 5; a *= 3;,这表示将a的值为5,然后乘以3,再将结果15赋值给a。
/=:除等于运算符,将左边的值与右边的值相除,并将结果赋值给左边的变量。例如:int a = 5; a /= 3;,这表示将a的值为5,然后除以3,再将结果1.6666666666667赋值给a。
^=:异或等于运算符,将左边的值与右边的值进行异或运算,并将结果赋值给左边的变量。例如:int a = 5; a ^= 3;,这表示将a的值为5与3进行异或运算,再将结果6赋值给a。
【异或(XOR)运算的特性:
- 0 XOR 0 = 0
- 0 XOR 1 = 1
- 1 XOR 0 = 1
- 1 XOR 1 = 0
- a被初始化为5,这在二进制中表示为101。然后,a ^= 3执行了异或运算。3在二进制中表示为011。所以,
- 101 XOR 011 = 110
- 这得到的结果在十进制中就是6,所以a的值最后被赋为了6。】
|=:或等于运算符,将左边的值与右边的值进行按位或运算,并将结果赋值给左边的变量。例如:int a = 5; a |= 3;,这表示将a的值为5与3进行按位或运算,再将结果7赋值给a。
【按位或运算符(|)在C语言中对两个二进制数的每一位执行逻辑或运算,即两个位中只要有一个为1,则结果位就为1。
首先,我们看一下5和3的二进制表示:
5的二进制表示为: 101
3的二进制表示为: 011
使用按位或运算符对这两个数进行运算后,结果为:
101 | 011 = 111
将这个结果转换回十进制,我们得到7。因此,a |= 3的结果是7。
】
>>=:右移等于运算符,将左边的值进行右移位操作,并将结果赋值给左边的变量。例如:int a = 5; a >>= 1;,这表示将a的值为5向右移一位,再将结果2赋值给a。
【右移运算符(>>)把左操作数的二进制表示向右移动指定的位数,右边空出的位用0填充。对于数值5,其在二进制中的表示是101。当你执行a >>= 1时,5的二进制表示101被向右移动一位,变成010,这就是2的二进制表示。因此,a的值从5变为了2。】
<<=:左移等于运算符,将左边的值进行左移位操作,并将结果赋值给左边的变量。例如:int a = 5; a <<= 1;,这表示将a的值为5向左移一位,再将结果10赋值给a。
【向左移位运算符(<<)是将左操作数的二进制表示向左移动指定数量的位,移动后空出的位用0填充。数值5的二进制表示是101。当你执行a <<= 1时,5的二进制表示101被向左移动一位,变成1010。这个二进制数转换回十进制就是10。因此,a的值从5变为了10。】
(5)单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
【&
运算符是取地址运算符,用于获取变量的内存地址。例如:int a = 10; int *p = &a;
,这里 &a
就表示获取变量 a
的内存地址,然后将这个地址赋值给指针 p
。】
sizeof 操作数的类型长度(以字节为单位)
【sizeof
操作符用于计算变量、数据类型或对象的大小(以字节为单位)。这通常用于确定在内存中分配给特定变量或数据类型的空间大小。】
~ 对一个数的二进制位取反
【操作符是对操作数的二进制位取反。它会将操作数中每个二进制位上的0变为1,1变为0。】
-- 前置、后置—
++ 前置、后置++
【--
和 ++
是前置和后置的自增自减运算符。它们的区别在于,前置版本先增加或减少然后再进行其他操作,后置版本先进行其他操作然后再增加或减少。例如:int a = 5; int b = --a;
,这里 --a
表示先对 a
进行自减操作,然后赋值给 b
,所以 a
的值变为4,b
的值也变为4。而 int a = 5; int b = a--;
,这里 a--
表示先赋值给 b
,然后再对 a
进行自减操作,所以 a
的值变为4,但 b
的值还是5。】
* 间接访问操作符(解引用操作符)
【*
运算符是间接访问操作符,也称为解引用操作符。它用于获取指针指向的实际值。例如:int a = 10; int *p = &a; int c = *p;
,这里 *p
表示获取指针 p
所指向的变量的值,即 a
的值,然后赋值给 c
,所以 c
的值为10。】
(类型) 强制类型转换
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int arr[10]={0};
printf("%d\n",sizeof(arr));
printf("%d\n",sizeof(arr[0]));
int n=sizeof(arr)/sizeof(arr[0]);
printf("%d\n",n);
return 0;
}
1、按位取反运算符 ~ 会将操作数的每个位取反,即将0变为1,将1变为0。对于有符号整数,取反操作将应用补码表示。因此,如果变量 a 的初始值是 1,则它的补码表示为 0000 0000 0000 0001。取反后的结果为 1111 1111 1111 1110,转换为十进制为 -2。所以,第一个 printf 语句输出的结果为 -2。
对于变量 b 的初始值 0,它的补码表示为 0000 0000 0000 0000。取反后的结果为 1111 1111 1111 1111,转换为十进制为 -1。所以,第二个 printf 语句输出的结果为 -1。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a=1;
int b=0;
printf("%d\n",~a);
printf("%d\n",~b);
return 0;
}
2、int b = a++,这是一个后置递增运算符的使用。后置递增运算符会先使用变量 a 的值,然后再将其递增。int q = ++p,这是一个前置递增运算符的使用。前置递增运算符会先将变量 p 的值递增,然后再使用递增后的值。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a=10;
int b=a++; //后置++,先用后+
int p=100;
int q=++p; //前置++,先+后用
printf("%d\n",a);
printf("%d\n",b);
printf("%d\n",p);
printf("%d\n",q);
return 0;
}
3、强制转换:强制类型转换会截断浮点数的小数部分
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = (int)3.14; //强制类型转换
printf("%d\n", a);
return 0;
}
(6)条件操作符(三目操作符)
1、使用三目运算符(?:)进行条件判断,语法为 condition ? expression1 : expression2。如果 condition 条件为真,则表达式的值为 expression1;如果 condition 条件为假,则表达式的值为 expression2。在这里,判断条件是 a > b,即变量 a 是否大于变量 b。如果条件成立,即 a 大于 b,那么表达式的值为 a;否则,表达式的值为 b。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 10;
int b = 100;
int max = 0;
/*if (a > b)
max = a;
else
max = b;*/
max = a > b ? a : b;
printf("%d\n", max);
return 0;
}
2、变量的赋值使用了逗号运算符,该运算符会逐个执行表达式,并返回最后一个表达式的结果。逗号运算符的执行顺序是从左到右。每个表达式都会被计算,并依次执行。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a=15;
int b=20;
int c=30;
int d=(a=b+5,b=c-7,c=a-3); //逗号表达式从左往右计算,呈现最后一个表达式结果
printf("%d\n",d);
return 0;
}
(7)下标引用、函数调用和结构成员
下标引用操作符 [] 用于访问数组中特定位置的元素
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int arr[10]={0,1,2,3,4,5,6,7,8,9};
printf("%d\n",arr[7]); //[]就是下表引用操作符
printf("haha\n"); //函数后的()就是函数调用符
return 0;
}