操作符优先级
操作符都有一个优先级,比如最高优先级就是计算括号内的内容,还有就是我们都知道的乘法比加减法优先级高,如果是计算c+a*b肯定是先计算a*b在计算+c这样一来我们写代码便可能让程序发生歧义,一些比较不好的代码就会出现,比如下面这个计算
我们可以有两种计算,如果是先在整个计算来看,肯定是先计算乘法再计算除法如下所示
当然我们可以从左到右看,例如第一个a*b+c*d我们先计算a*b然后计算c*d再相加,然后整体在和后面e*f看我们先计算e*f再相加,就有了如下的顺序
看似两者的结果是相同的,但是如果我们前面的c是一个表达式,里面包含了e和f的一些参数,那么这两段代码的结果就是不同的,我们应该避免这种情况出现
整形提升
在对char类型进行整型相加的时候数据会先进行整型提升char占用一个字节的会扩充成四个字节,如果符号位为0前面补0符号位为1前面补1,在进行相加,最后截断后八位作为新的char数据,如果输出的时候也是同理,先扩充,再截断,如下面代码的输出结果是-126,我们来看一下编译器是怎么输出的
//整型提升
#include <stdio.h>
int main()
{
char a = 127; //01111111
char b = 3; //00000011
char c = a + b;
//00000000000000000000000001111111 符号数为0前面补0
//00000000000000000000000000000011
//00000000000000000000000010000010 补码;
//此时c = 10000010
printf("%d", c);
//打印字符类的整数
//11111111111111111111111110000010 补码 符号数为1前面补1
//11111111111111111111111110000001 反码
//10000000000000000000000001111110 原码打印 -126
return 0;
}
数组逆序
下面介绍两个非常简单的代码,数组逆序和数组交换,一个用的函数的递归,一个用的不建立临时变量的异或,分享以下源代码和输出结果
//init函数初始数组为0
//printf函数打印每个数组元素
//reverse函数完成数组的逆序
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void init(int* board ,int n)
{
int i;
for (i = 0; i < n; i++)
{
board[i] = 0;
}
}
void print(int* board, int n)
{
int i;
for (i = 0; i < n; i++)
{
printf("%d", board[i]);
}
}
void reverse(int* board, int n)
{
int temp = board[n-1];
board[n - 1] = board[0];
if (n > 2)
{
reverse(board + 1, n - 2);
}
board[0] = temp;
}
int main()
{
int a[9];
int size = sizeof(a) / sizeof(a[0]);
init(a, size);
int i;
for (i = 0; i < size; i++)
{
scanf("%d", a + i);
}
print(a,size);
printf("\n");
reverse(a,size);
print(a, size);
return 0;
}
输出结果如下
数组交换
//交换数组
#include <stdio.h>
void print(int* board, int n)
{
int i;
for (i = 0; i < n; i++)
{
printf("%d", board[i]);
}
printf("\n");
}
int main()
{
int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
int b[10] = { 10,9,8,7,6,5,4,3,2,1 };
int i;
printf("原先的两个序列为:\n");
printf("a:");
print(a, 10);
printf("b:");
print(b, 10);
for (i = 0; i < 10;i++)
{
a[i] = a[i] ^ b[i];
b[i] = b[i] ^ a[i];
a[i] = b[i] ^ a[i];
}
printf("交换后的序列为:\n");
printf("a:");
print(a, 10);
printf("b:");
print(b, 10);
return 0;
}
此代码运行结果如下