第二个{后的k第一次是几,for后面那个i++是指循环执行一遍后再加吗

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-08-01
for循环执行顺序

这道题的难点是:&&的短路功能,当第一个表达式的值为false的时候,则不再计算第二个表达式。
所以for(i = 0; i < 6; i++ && k++)循环的执行顺序:
当i=0的时候,第一次进入for循环,for语句执行到i = 0; i < 6;结束,并不执行i++ && k++,当第一次循环结束后i=0,k=0。
进行第二次循环for语句执行 i < 6; i++ && k++。并先执行i++ && k++。这个时候i=0,为false,所以就不执行右边即k++。由此第二次循环后i=1,由于k++没有执行,所以k还是=0。
进入第三次循环,i=1。&&必须要通过计算右边的表达式才能得出结果。所以开始执行k++。所以第三次循环 时候 i=2,k=1 。以此类推,一直循环到i=6条件不成立停止循环。

扩展资料:
基本的优先级需要记住:
指针最优,单目运算优于双目运算。如正负号。
先算术运算,后移位运算,最后位运算,逻辑运算最后计算。请特别注意:1 << 3 + 2 && 7等价于 (1 << (3 + 2))&&7。

Java中&&和&都是表示与的逻辑运算符,都表示逻辑运输符and,当两边的表达式都为true的时候,整个运算结果才为true,否则为false。
&可以用作位运算符,当&两边的表达式不是Boolean类型的时候,&表示按位操作。
参考资料:“与”运算-百度百科
运算符优先级

区别:
一、从代码执行的效果来看,它们并无任何区别,但是它们所生成的代码是有有所不同的。
1、i++:先引用后增加;
意思是:先在i所在的表达式中使用i的当前值,后让i加1。
2、++i:先增加后引用;
意思是:让i先加1,然后在i所在的表达式中使用i的新值。
二、i++由于是在使用当前值之后再+1,所以会需要一个临时变量来转储,而++则直接+1,不存在这样的问题。
举例代码:
int c=0;
for(int i=0;i<=50;i++)
c=c+i;
std::cout<<c;
1、首先在debug下编译:
i++情况
; 9 : int c;
; 10 : for(int i=0;i<=50;i++)
mov DWORD PTR _i$20035[ebp], 0
jmp SHORT $LN3@wmain
$LN2@wmain:
mov eax, DWORD PTR _i$20035[ebp]
add eax, 1
mov DWORD PTR _i$20035[ebp], eax
$LN3@wmain:
cmp DWORD PTR _i$20035[ebp], 50 ; 00000032H
jg SHORT $LN1@wmain
; 11 : c=c+i;
cmp BYTE PTR $T25811[ebp], 0
jne SHORT $LN6@wmain
push OFFSET $LN7@wmain
call __RTC_UninitUse
add esp, 4

2、++i情况
; 9 : int c;
; 10 : for(int i=0;i<=50;++i)
mov DWORD PTR _i$20035[ebp], 0
jmp SHORT $LN3@wmain
$LN2@wmain:
mov eax, DWORD PTR _i$20035[ebp]
add eax, 1
mov DWORD PTR _i$20035[ebp], eax
$LN3@wmain:
cmp DWORD PTR _i$20035[ebp], 50 ; 00000032H
jg SHORT $LN1@wmain
; 11 : c=c+i;
mp BYTE PTR $T25811[ebp], 0
jne SHORT $LN6@wmain
push OFFSET $LN7@wmain
call __RTC_UninitUse
add esp, 4
$LN6@wmain:
mov eax, DWORD PTR _c$[ebp]
add eax, DWORD PTR _i$20035[ebp]
mov BYTE PTR $T25811[ebp], 1
mov DWORD PTR _c$[ebp], eax
jmp SHORT $LN2@wmain
$LN1@wmain:
三、
++i确实省去了对内存操作的环节,直接add eax, 1,用++i真的能提高性能。
当然,上面是用debug版本,也就是说没有优化,那么在release优化的情况下。
举例:
1、i++优化
; 9 : int c;
; 10 : for(int i=0;i<=50;i++)
mov ecx, DWORD PTR _c$[esp+4]
xor eax, eax
$LL3@wmain:
; 11 : c=c+i;
add ecx, eax
inc eax
cmp eax, 50 ; 00000032H
jle SHORT $LL3@wmain
2、++i优化
; 9 : int c;
; 10 : for(int i=0;i<=50;++i)
mov ecx, DWORD PTR _c$[esp+4]
xor eax, eax
$LL3@wmain:
; 11 : c=c+i;
add ecx, eax
inc eax
cmp eax, 50 ; 00000032H
jle SHORT $LL3@wmain
结论:在没有编译器优化的情况下,++i更好。优化过后两者都一样,看起来似乎喜欢怎样写都无所谓了。
但是如果这里的i不是int而是迭代器,那么++在前和在后就会有所不同,使用++i将会有切实的更高的效率。虽然int情况下没多少区别,但为了语法上的统一,最好一律改用++i这种形式。
参考资料:
百度百科——for循环

第一次k=i=0;

先执行 i=0; 然后判断条件 i<n-1是否成立,成立的话就执行第一个if( )里 的语句。for循环for循环的i++是最后等for的语句执行玩了才执行的。

  • 首先能先给我解释下书里面的一个例子。 for k =5 to 10 step 2 k=...
    答:1、第一次进入循环时,赋初值k=5,运行后k*2后等于k=5*2=10;第二次运行时k再加步长值2,k=10+2=12>10,退出循环。2、第一次循环,i=1;s=0+1=1;i=1*2=2 第二次运行,i=2+2=4,s=1+1=2;i=4*2=8 第三次运行,i=8+2=10,s=2+1=3,i=10*2=20 第四次运行,i=20+...
  • c++高手 进
    答:include "stdio.h"main(){ int c=0,k;for(k=1;k<3;k++)//这个会执行两次,k值分别为1,2。switch(k){ default:c+=k; //对于switch语句来说,default选项,是说在没有case被选中的情况下,执行default后面的语句,第一次循环中,k为1,case无匹配,此句执行,c为1。第二次循环中,k...
  • for(j=0,i=0;j<6,i<10;j++,i++) { k=i+j; } k 值最后是多少?
    答:答案是18,首先每次for循环的i和j值是相等的:第一次:j=0,i=0, 符合条件,k=j+i=0;第二次:j=1,i=1,符合条件,k=j+i=2;第三次:j=2,i=2,符合条件,k=j+i=4;第四次:j=3,i=3,符合条件,k=j+i=6;第五次:j=4,i=4,符合条件,k=j+i=8;第六次:j=5,i=5,符合...
  • C语言题,求解释
    答:{static int a=2;c=c+1;return (a++)+c;}main(){ int i,k=0;for(i=0;i<2;i++){int a=3;k+=f(a);}k+=a;printf(“%d\n”,k);}程序运行结果是147.这题有点陷阱了,先是3到f函数定义了个static int a=2;就是说第一次调用好以后a=a++吗,返回的是3+1+2=6第二次调用的时候a!
  • C语言FOR循环解析
    答:首先,k=2 的过程不用考虑,为什么呢?因为在第二个循环前 s又被重新赋值为1了。具体如下:1、k=2时 ,s=1,j=2, 然后是 s=1+2+3+4+5=15 其实这部分根本不需要算,为什么,因为s在第二层循环前又会被重新赋值。2、k++,k++后,k=4,s=1,j=4,然后执行两次循环 即为s...
  • 求以下C程序的运行结果,请解答的详细点。
    答:{ m=0;for(j=k;j<=5;j++)m=m+k*j;//加粗部分这是一个只有一句话的循环。} 第二个for被包含在第一个for里,所以第二个for(就是j)全部循环完才能再一次循环第一个for(就是k)。2. 【演示】我在下面写出每次变化的值,请自行体会。k=5,j=?,m=?(第一次循环开始)k=5...
  • c语言问题
    答:m=(k-10)*3.0+11+14.7;//第三次,第四次都用这个计算。分别 得到48.20和48.20 printf("fare=%.2f\n",m);} } 楼主用我的运行一下就知道过程了···相当直观的 所以其实 data error!fare=0.00 这两个是第一个运行的结果。后面三次是各自运行的结果 你给m初始一下。结果就不一样...
  • int k,j,s; for(k=2;k<6;k++,k++) {s=1; for(j=k;j<6;j++)s + =j...
    答:for(k=2;k<6;k++,k++) //k++有两个,所以的步长是2,也就是k的值会取到 2,4,因为s是局部变量,在内部循环修改的,所以k=2的时候你不用关心,因为k=4的时候就覆盖掉了会执行s=1,然后得出里层循环又一个s的值,最终的结果是由k=4决定的。{ s=1;for(j=k;j<6;j++)s + =j...
  • C语言题目
    答:你好,你认为两次是第二个for循环了两次。实际上在第一个for第一次运行后,第二个for运行了两次,输出两次*,此时i = 2;由于i = 2<4,故第一个for再次循环(注意,这个都是在第一个for中进行的,所以i只赋了一次值,所以i保留2),而第二个for是属于另一次调用,此时k再次被赋值1<3;第二...
  • 设int j,k; 执行for(j=k=3;j-1;k+=j--) ;后k的值是
    答:首先执行第一次k+=j--后k=3+3=6 j变为2 第二次执行k=k+2=8 j变为1 此时j-1为0循环条件为0(判断j-1结果为0或者非0),跳出循环