C语言学习【运算符优先级】
butter = 25.0 + 60.0 * n / SCALE;
上述代码的运算顺序是(一般是从左到右)
60.0 * n 首先计算表达式中的*或/(假设n的值为6)
360.0 / SCALE 然后计算表达式中第2个*或/
25.0 + 180 最后计算表达式里第1个+或-
下图为运算符优先级(从低至高)
![](https://img-blog.csdnimg.cn/img_convert/83b2826b74b984d07dc12072d9640ecc.png)
优先级和求值顺序
/* 优先级测试 */
#include "stdio.h"
int main(void)
{
int top, score;
top = score = -(2+5) * 6 + (4 + 3 * (2+3));
printf("top = %d, score = %d\n", top, score);
return 0;
}
程序运行结果
top = -23, score = -23
sizeof运算符和size_t类型
sizeof运算符以字节为单位返回运算对象的大小;
1字节定义为char类型占用的空间大小
/* 使用sizeof运算符 */
// 使用 C99 新增的%zd 转换说明 -- 如果编译器不支持%zd,请将其改成%u 或%lu
#include "stdio.h"
int main(void)
{
int n = 0;
size_t intsize;
intsize = sizeof(int);
printf("n = %d, n has %zd bytes; all ints have %zd bytes.\n",
n, sizeof n, intsize);
}
程序运行结果
n = 0, n has 4 bytes; all ints have 4 bytes.
求模运算符:%
求模运算符(modulus operator)用于整数运算,求模运算符给出其左侧整数除以右侧整数的余数(remainder),求模运算符只能用于整数,不能用于浮点数
/* 把秒数转换成分和秒 */
#include "stdio.h"
#define SEC_PER_MIN 60 /* 1分钟 = 60秒 */
int main(void)
{
int sec, min, left;
printf("Convert seconds to mintes and seconds!\n");
printf("Enter next value (<= 0 to quit): \n");
scanf("%d", &sec);
while(sec > 0)
{
min = sec / SEC_PER_MIN; /* 截断分钟数 */
left = sec % SEC_PER_MIN; /* 剩下的秒数 */
printf("%d seconds is %d minutes, %d seconds.\n", sec, min, left);
printf("Enter next value(<= 0 to quit): \n");
scanf("%d", &sec);
}
printf("Done!\n");
return 0;
}
程序运行结果
120 seconds is 2 minutes, 0 seconds.
Enter next value(<= 0 to quit):
150
150 seconds is 2 minutes, 30 seconds.
Enter next value(<= 0 to quit):
-1
Done!
递增运算符:++
递增运算符(increment operator)执行简单的任务,将其运算对象递增1.
前缀模式:++
出现在其作用的变量前面,这是前缀模式;
后缀模式:++
出现在其作用的变量后面,这是后缀模式.
/* 递增:前缀和后缀 */
#include "stdio.h"
int main(void)
{
int ultra = 0, super = 0;
while(super < 5)
{
super++;
++ultra;
printf("super = %d, ultra = %d\n", super, ultra);
}
return 0;
}
程序运行结果
super = 1, ultra = 1
super = 2, ultra = 2
super = 3, ultra = 3
super = 4, ultra = 4
super = 5, ultra = 5
++i与i++的区别
/* 前缀和后缀 */
#include "stdio.h"
int main(void)
{
int a = 1, b = 1;
int a_post, pre_b;
a_post = a++; /* 后缀递增 */
pre_b = ++b; /* 前缀递增 */
printf("a a_post b pre_b \n");
printf("%1d %5d %5d %5d\n", a, a_post, b, pre_b);
return 0;
}
程序运行结果
a a_post b pre_b
2 1 2 2
a
和b
都递增了1,但是,a_post
是a
递增之前的值,而b_pre
是b
递增之后的值,这就是++
的前缀形式和后缀形式的区别.
前缀形式
q = 2*++a; /* 首先, a递增1;然后2乘以a,并将结果赋值给q */
q = 2*a++; /* 首先,2乘以a,并将结果赋给q;然后,a递增1 */
a_post = a++; /* 后缀:使用a的值之后,递增a */
b_pre = ++b; /* 前缀:使用b的值之前,递增b */
单独使用递增运算符时,使用那种形式都没有关系
递减运算符:–
每种形式的递增运算符都有一个递减运算符(decrement operator)与之对应,用--
代替++
即可.
--count; /* 前缀形式的递减运算符 */
count--; /* 后缀形式的递减运算符 */
优先级
递增运算符和递减运算符都有很高的结合优先级,只有圆括号的优先级比它们高。
x*y++
表示的是(x)*(y++)
;
如果n++
是表达式的一部分,可将其视为“先使用n,再递增”;而++n
则表示“先递增n,再使用”。