虽然 逗号表达式最终表达式的值 是 最右值,但是 它的计算过程是 从左往右一个个依此进行的;
也就是这过程里,其他表达式可以是赋值语句,从而可以改变很多变量,这就是它存在的意义
#include<stdio.h>
#include<math.h>
int main()
{
int a[10]= {0},b[10]= {0},n,m,i=1,k=0,j,h,p,sum;
scanf("%d",&n);
while(n!=0)
{
m=n%10;
a[i]=m;
n/=10;
k++;
i++;
}
h=k;
for(j=0; j<h-1; j++)
{
for(p=0; p<10; p++)
b[p]=b[p]+a[k]*(k-1)*pow(10,k-2);
for(p=0; p<a[k]; p++)
b[p]+=pow(10,k-1);
sum=1;
for(p=1; p<k; p++)
sum+=a[p]*pow(10,p-1);
b[a[k]]=sum+b[a[k]];
k--;
}
for(j=0; j<h; j++)
b[0]-=pow(10,j);
for(j=0; j<=a[1]; j++)
b[j]=b[j]+1;
for(p=0; p<10; p++)
printf("%d ",b[p]);
return 0;
}
区间法的思路就稍微大一点,利用for就可轻松解决(也可以利用递归的方法)。但不知道为什么,数字稍微大一点时,用codeblocks运行结果就会出错,但用别的编译器运行,就没什么问题了。
问题解答:
在C++中使用逗号表达式时,如果只输出表达式n的结果,前面的表达式123并不是无用的。它们分别有以下作用:
1.第一个表达式1:在逗号表达式中,逗号左边的表达式首先会被执行,这里的1就是第一个表达式。它的作用可以是任何有副作用的表达式,例如计算一个变量的值,或者执行一个函数等。在该问题中,可能是计算行列式系数的值,但需要查看具体实现。
2.第二个表达式2: 在该问题中,可能是计算行列式中选中项的乘积。
3.第三个表达式3: 在该问题中,可能是在输出时,输出格式的控制,例如在序列中间添加逗号等。
具体的实现需要查看代码,如果只是单纯的输出表达式n的结果,可以去掉1和2,只保留表达式n即可。
例如:假设有一个逗号表达式(1+2, 3+4, 5+6),那么在这个表达式中,第1个表达式1为1+2,第2个表达式2为3+4,第三个表达式3为5+6。如果只需要输出第3个表达式的结果11,则可以写成:
int res = (1+2, 3+4, 5+6); //执行完逗号表达式后,res的值为11
cout << res << endl; //输出结果11
需要注意的是,虽然在逗号表达式中前面的表达式可以有副作用,但是不建议滥用逗号表达式,因为逗号表达式容易造成代码的可读性和可维护性降低,建议对逗号表达式的使用多加思考。
参考资料:
C++逗号表达式 https://www.runoob.com/cplusplus/cpp-comma-operator.html
《C++ Primer》第五版,第4.9节 “逗号运算符”。
行列式C++代码演示 http://www.cnblogs.com/Wescnblogs/p/6567852.html