doul3 发表于 2023-7-29 23:00

初学C语言,有几个问题请教各位大佬

有如下代码,请教的问题:
1.for循环下存在if循环,当条件(比如7)满足for循环进入if循环后,发现不能满足if条件 ,是不是直接转入在下一个if循环?
2.这里 bool类型的isPrime有什么作用?第一个if里面的语句isPrime = false是什么意思?尤其是下面if (isPrime)这句。

以上,如能解答,不胜感激!
# include <stdio.h># include <stdbool.h>

int main(void)
{
unsigned long num;
unsigned long div;
bool isPrime;

while (scanf("%d",&num) == 1)
{
for (div=2,isPrime=true;(div*div)<=num;div++)       
{
        if (num%div==0)
        {
                if ((div*div)!=num)
                printf("%lu is divisible by %u and %lu.\n",
                        num,div,num/div);
          else
          printf("%lu is divisible by %lu.\n",num,div);
          isPrime=false;
        }
}
        if (isPrime)//这条语句是什么意思,isPrimer???
        printf("%lu is primer. \n",num);
        printf("Next one:\n");
}
printf("Bye");       

return 0;
}

gjs1206 发表于 2023-7-30 11:22

第一个问题,代码是一条一条执行的,首先看这个for循环里面的语句,只有一个if和属于if的花括号包含的语句,也就是说进入这个for循环的话就只能执行if语句,如果if条件没有满足就没有其他语句可以执行了,所以直接进入下一次循环。第二个问题bool isPrime是声明变量isPrime为布尔类型,话说我怎么记得C没有布尔类型?总之布尔类型就是两个值,True为真等价于1,False为假等于0,if里面为真也就是为1就会进入if里面执行里面的语句,否则不执行。if (isPrime) 的意思就是假如isPrime为真,也就是isPrime为1或者True就会执行if里面的语句,只是你这里if(isPrime) 后面似乎没有语句可以执行啊?下面的输出语句缩进也不是在if里面的。

stars5 发表于 2023-7-30 11:38

for的条件如果满足,继续循环;不满足的话,跳出循环

bj6688 发表于 2023-7-30 13:09

语言太多了

一剑飘零 发表于 2023-7-30 13:15

本帖最后由 一剑飘零 于 2023-7-30 13:20 编辑

gjs1206 发表于 2023-7-30 11:22
第一个问题,代码是一条一条执行的,首先看这个for循环里面的语句,只有一个if和属于if的花括号包含的语句 ...
有的。要加头文件。 <stdbool.h>
查了一下说C99之前没有
我可能直接学的C99的吧。之前的不清楚。

if (isPrime) 后面如果没有分号,后面可以跟一条语句是连在一起的。

虽然不推荐但是也可以这么写。

lyjccmm 发表于 2023-7-30 14:34

我觉得学语言还是要踏踏实实的,一步一步来。

很明显你有一些基础的东西没懂,所以你从别的地方贴来了这份代码,比如:这代码根本就运行不起来,说明你语法还不过关。

这份代码其实只是输入一个数字,判断这个数字是不是质数而已,因为源代码的缩进看着头痛,我就重新贴一份

```c
#include <stdio.h>
#include <stdbool.h>

int main()
{
    unsigned long num;
    unsigned long div;
    bool isPrime;
   
    while (scanf("%d", &num) == 1)
    {
      for (div=2, isPrime=true; (div*div) <= num; div ++)   
      {
            if (num % div == 0)
            {
                if ((div*div)!=num)
                  printf("%lu is divisible by %u and %lu.\n", num, div, num/div);
                else
                  printf("%lu is divisible by %lu.\n", num, div);
                isPrime = false;
            }
      }
      if (isPrime)
            printf("%lu is primer. \n",num);
      printf("Next one:\n");
    }
    printf("Bye");
    return 0;
}
```

然后开始回答你的问题:
> 1.for循环下存在if循环,当条件(比如7)满足for循环进入if循环后,发现不能满足if条件 ,是不是直接转入在下一个if循环?

for循环下存在if循环?什么意思?if又不是循环,就算你说错了,if里面有个循环,而实际if里面也没有循环,所以不知道你这句话说的啥意思。

后来我猜测,你可能想说的是“for循环语句块里存在if条件判断语句块”

> 不能满足if条件 ,是不是直接转入在下一个if循环

还是听不懂。。。不能满足if条件,语句就直接往后走,如果后面有语句就执行语句,没有语句了,就开始for的下一轮循环

> 2.这里 bool类型的isPrime有什么作用?

用来标记输入的数字是不是质数,一开始先默认它是质数,所以设置成true,在for循环一次又一次的验证下,然后发现这个数存在别的因数,那么就知道输入的数字不是质数,把它标记为false

> 第一个if里面的语句isPrime = false是什么意思?

就是我说的,把它标记为不是质数

>   尤其是下面if (isPrime)这句。

这句是判断,判断经过for循环的多轮结果后,看看这个变量是不是还是质数,然后是,要输出一句“xxx是质数”

如果你不理解bool类型的变量,可以把`bool isPrime;`看成`int isPrime;`,把 `isPrime=true` 看成 `isPrime=1`,把 `isPrime=false` 看成 `isPrime=0`,这样替换后,程序依旧能运行

我看代码里面还有一个注释提了问题

> //这条语句是什么意思,isPrimer???

这个``没有任何意思,是你自己复制代码复制错了,不知道你从哪里复制的,c语言也没有这种写法,而且加上这个``程序都运行不起来,也就是我说的,“这代码根本就运行不起来”

ddsluo 发表于 2023-7-30 14:37

if (isPrime)//这条语句是什么意思,isPrimer???
    printf("%lu is primer. \n",num);
if后面没有{},就只对应IF下边这一行。
    printf("Next one:\n");
这一行就不属于IF语句了

c222y 发表于 2023-7-30 15:53

看不懂 太深奥了

lyjccmm 发表于 2023-7-30 16:38

本帖最后由 lyjccmm 于 2023-7-30 16:41 编辑

lyjccmm 发表于 2023-7-30 14:34
我觉得学语言还是要踏踏实实的,一步一步来。

很明显你有一些基础的东西没懂,所以你从别的地方贴来 ...
我知道那个`b`是什么东西了

你竟然在发帖的时候,粘贴代码的时候,你在代码段里面加粗了注释,那个`b`是论坛发帖的“加粗”

这种操作没有用的,显示出来就会是你现在看到的那样,在代码里面,多了一个`b`和一个`/b`,没有显示加粗,还导致代码运行不起来。

ccbbaa 发表于 2023-7-30 18:02

当满足for循环条件时,会进入if循环。如果if循环中的条件不满足,则不会执行if循环中的语句,而是直接进入下一个循环。
bool类型的isPrime在这里用于标记一个数字是否为素数。如果一个数字满足素数的条件,则isPrime为true,否则为false。第一个if里面的语句isPrime = false表示当前数字不是素数,将isPrime标记为false。后面的if (isPrime)则检查isPrime的值,如果为true,则表示当前数字是素数,否则不是素数。
页: [1] 2
查看完整版本: 初学C语言,有几个问题请教各位大佬