C语言基础------自增自减条件判断循环

简单来说:++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:

  1. 当 i=1 时,m=1,sum=1。
  2. 当 i=2 时,m=1×2,sum=1+1×2。
  3. 当 i=3 时,m=1×2×3,sum=1+1×2+1×2×3。
  4. 当 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 。

猜你喜欢

转载自blog.csdn.net/baidu_41774120/article/details/113172559