简单来说:++i 和 i++ 在单独使用时,都表示 i=i+1;––i 和 i–– 在单独使用时,都表示 i=i–1。
而 a=++i 就相当于 i=i+1,a=i;a=i++ 就相当于 a=i,i=i+1。 同理,a=––i 就相当于 i=i–1,a=i;a=i–– 就相当于 a=i,i=i–1。亦即++i或--i先增一(减一)再使用,i++或 i--先使用再增一(减一)。
//求 1! + 2! + 3! + ... + n!
# include <stdio.h>
int main(void)
{
int n = 0;
int i = 0;
int m = 1;
int sum=0;
printf("请输入n的值:");
scanf("%d", &n);
for (i=1; i<=n; ++i)
{
m = m * i;
sum = sum +m;
}
printf ("sum = %d\n", sum);
return 0;
}
例如 n=4:
- 当 i=1 时,m=1,sum=1。
- 当 i=2 时,m=1×2,sum=1+1×2。
- 当 i=3 时,m=1×2×3,sum=1+1×2+1×2×3。
- 当 i=4 时,m=1×2×3×4,sum=1+1×2+1×2×3+1×2×3×4。
//输出 1~1000 之间所有的完全平方数。
# include <stdio.h>
# include <math.h> //要用sqrt()
int main(void)
{
int i; //循环变量
int x; //存储每个数的二次方根
for (i=1; i<1000; ++i)
{
x = sqrt(i); /*如果i不是完全平方数, 那么sqrt(i)肯定是小数, 而i是int型, 所以x是sqrt(i)取整后的值, 这样x*x肯定不等于i*/
if (x*x == i)
{
printf("%d\t", i); // \t是跳到下一个Tab位置
}
}
printf("\n");
return 0;
}
输出结果为:
1 4 9 16 25 36 49 64 81 100
121 144 169 196 225 256 289 324 361 400
441 484 529 576 625 676 729 784 841 900
961
//输出 1~1000 之间所有的完全平方数,不使用 sqrt()
# include <stdio.h>
int main(void)
{
int i; //循环变量
for (i=1; i*i<1000; ++i)
{
printf("%d\t", i * i); // \t是跳到下一个Tab位置
}
printf("\n");
return 0;
}
if语句后的括号问题:
- 加上大括号相当于一个语句块,if条件只影响其后面的第一个语句或语句块,加括号的话,则执行括号中的全部语句(也就是在if条件成立的情况下,则全部执行,如果if条件不成立,则整个括号中的语句都不执行);而不加括号的话,则影响其后的第一条语句,也就是说不管if条件成不成立,第一句以后的都不会有任何影响。if 语句后有大括号, 则大括号里面所有的语句都会在if表达式为真时执行;如果没大括号,则if表达式为真时只会执行第一条语句。
#include <stdio.h>
int main()
{
if (true)
{
printf("11111111111\n"); // 这两条都会打印
printf("11111111111\n");
}
if (false)
printf("11111111111\n"); // 只有这一条不会打印
printf("22222222222\n"); // 以下两条都会打印
printf("22222222222\n");
return 0;
}
- if ,else 用法解析
1. if与else的成对关系依照就近原则
2. if与else的成对关系遇到花括号时,就近原则找相成对花括号
3. 局部代码块一定要加括号 ,举例如下:
if(a <= 1)
if(b > 1)
printf("yes\n");//a<=1且b>1时执行
else
printf("NO\n");//a<=1且b<=1时执行
//用括号括起来更shu易理解
if(a <= 1){
if(b > 1){
printf("yes\n");//a<=1且b>1时执行
}else{
printf("NO\n");//a<=1且b<=1时执行
}
}
//第二种情况
if(a <= 1){
if(b > 1)
printf("yes\n");//a<=1且b>1时执行
}
else
printf("NO\n");//a>1时执行
#include<stdio.h>
void fun(int *s){
static int j=0;
do{s[j]+=s[j+1];
}while(++j<2);
}
main(){
int k,a[10]={1,2,3,4,5};
for(k=1;k<3;k++)
fun(a);
for(k=0;k<5;k++)
printf("%d",a[k]);
return 0;
}
运行结果为:35745,为什么?
1. do…while 和 while 的执行过程非常相似,唯一的区别是:“do…while 是先执行一次循环体,然后再判别表达式”。当表达式为“真”时,返回重新执行循环体,如此反复,直到表达式为“假”为止,此时循环结束。
现在思考一个问题: while 和 do…while 是否等价?它们是否可以相互转换?我们知道,while 和 for 是完全等价的,它们是可以相互转换的。那 do…while 和 while、for 等价吗?它们可以相互转换吗?
答案是“不能”。原因十分简单,while 循环体内部不一定会执行,当表达式一开始就为假的时候它就不会执行。但 do…while 不管表达式开始为真还是为假,循环体内部都会先执行一次。2. C语言中static的用法:static变量只能初始化一次。在函数内部定义的static变量,在函数调用过程中,能够保存值,意思就是下次调用函数,这个函数里的这个变量有值,不能被再次初始化。
上面的代码示例中,静态变量 j 第一次被赋值为0,之后不再执行这条语句,整体执行可以描述为:
1. k=0:j=0,a[0]=a[0] + a[1]=1+2=3;j=1,a[1]=a[1] + a[2]=2+3=5循环条件不满足,跳出循环。
2. k=1:j=2,a[2]=a[2] + a[3]=3+4=7循环条件不满足,跳出循环。
打印输出结果,即35745 。