(a=b=0,1)这里是逗号运算,该运算符优先级最低,最低!。就是最后一个表达式的值。就是说(a=b=0,1)就是1{此处还有一个作用就是为a、b赋值0}
至少第一遍循环时a<=m这里的真假值暂无影响。因为||的后半部分为true
循环体:s[a]=(b+=s[a]*t)%n,b/=n;
又是一个逗号运算符,所以等价为:
s[a]=(b+=s[a]*t)%n;
b/=n;
第二个for循环:两个输出没什么好看的,就两个;中间的m--作为判断条件,m小余0时跳出。
所以,我大约展开一下。#include
#define N 50
long s[N]={1},n=10000,t=2,a,b,m;//这一排不过问了
int main(void)
{
// for( ;a<= m || ++t <= N && (a=b=0,1);m==a++ && b && m++)
// s[a]=(b+=s[a]*t)%n,b/=n;
// a<= m || ++t <= N && (a=b=0,1)这个判断是这个顺序,首先看a<=m吗?真就返回// true后边不执行,假就执行( ++t <= N && (a=b=0,1)),看++t <= N 吗?假就返// 回false,真就执行(a=b=0,1),即返回true
//我将循环的第一次的a<= m || ++t <= N && (a=b=0,1)变形
bool kkk;
if(a<=m){kkk = 1;}
else if(!(++t<=N)){kkk = 0;}
else{a=b=0;kkk = 1;}
for(;kkk;){
//s[a]=(b+=s[a]*t)%n;
b+=s[a]*t;
s[a] = b%n;
b/=n;
//下面是每次循环的m==a++ && b && m++变形
if(!a){m = 0;}
else if(!b){m = 0;}
else{m = m;m++;}
//下面是后来每次循环的a<= m || ++t <= N && (a=b=0,1)变形
if(a<=m){kkk = 1;}
else if(!(++t<=N)){kkk = 0;}
else{a=b=0;kkk = 1;}
}
for(printf(("%d"),s[m]);m--; )//这个循环不重要便不多说了
printf("%04d",s[m]);
}
不容易哦,回答这个问题,我也学习了不少东西,因为有个短路原则在里面且有计算式在其间夹杂,所以两个逻辑判断必须改写成这种形式最准确、安全、有保障。
当然如果运行结果有所出入,希望您能指出,我们再学习讨论一番