小老虎007 发表于 2021-3-2 11:38:50

求助求助啊~

for里面判断这两种写法怎么结果不一样啊?自行调试绕晕了,还望大神指教下,有详细说明最好。谢谢!!

void insertion_sort(int arr[], int len)
{
      int i, j;
      for(i = 1; i < len; i++)
      {      
                int key = arr;      
                for(j = i -1; j >= 0 && arr > key; j--)      //不同点
                {
                              arr = arr;
                }
                arr = key;      
}

void insertion_sort(int arr[], int len)
{
      int i, j;
      for(i = 1; i < len; i++)
      {      
                int key = arr;      
                for(j = i -1; j >= 0 ; j--)      
                {
                              if(arr > key)      //不同点
                              arr = arr;
                }
                arr = key;      
}

洋洋痒 发表于 2021-3-2 12:48:27


初始值;进入循环条件;循环变量增值
我以为昨天写的很明白了
for循环括号内有两个分号,分成三部分,第一部分都是初始值   i初始值1   j 初始值是 i-1
第二部分都是进入循环的条件 第一个for条件是i < len      第二个for条件是 j >= 0 && arr > key这一整句话是一个条件,求这句话的真假
第三部分是循环变量增值   i 是一次循环增加1    j是一次循环减少1


你还有什么没明白的再问

巴巴鲁 发表于 2021-3-2 17:08:03

要搞清楚这个原因,对for语句熟悉就好了
for(表达式1; 表达式2; 表达式3)
{
}
for中各表达式楼上说的很详细了
for语句执行顺序是怎样的呢?
   首先初始化变量(也可以不初始化),表达式2再进行判断,成立进入for语句,不成立结束
      如果成立,执行表达式3,再进入第二部判断
了解了这些,我们就可以分析了:第一个是&&,不成立直接结束for语句
                                             第二个是判断j>=0,成立后会有个j--操作,结束条件是j<0时
说白了很简单,在两个程序内层for结束后可以打印j,一目了然

小老虎007 发表于 2021-3-2 23:18:37

洋洋痒 发表于 2021-3-2 12:48
初始值;进入循环条件;循环变量增值
我以为昨天写的很明白了
for循环括号内有两个分号,分成三部分, ...

你好,我的疑问是把&&后面的条件判断,改成下面用if的方法效果是一样的吗?我执行这个插入排序,下面的if的方法得不到正确的结果。(我感觉跟放在&&后面的方法这执行顺序不是一样吗)

洋洋痒 发表于 2021-3-3 02:16:29

本帖最后由 洋洋痒 于 2021-3-3 02:37 编辑

小老虎007 发表于 2021-3-2 23:18
你好,我的疑问是把&&后面的条件判断,改成下面用if的方法效果是一样的吗?我执行这个插入排序,下面的 ...

是不一样的,在if语句条件判断里,一旦不符合条件了,会立刻终止循环。
但是像你这样操作,即使 arr > key为False你还会进入下一次循环,最终很可能导致某一次循环arr又一次大于key了,既又符合条件了,就会执行arr = arr;从而导致最终结果的错误。这就是区别

具体if语句的条件判断怎么写是要根据实际情况来的,要求什么就怎么写
页: [1]
查看完整版本: 求助求助啊~