我的完整代码中有一段代码:
\nconst unsigned int GL=8000000;\nconst int cuba=8;\nconst int cubn=cuba+cuba;\nconst int cub3=cubn*cubn*cubn;\nint Length[cub3];\nint Begin[cub3];\nint Counter[cub3];\nint MIndex[GL];\nstruct Particle{\n int ix,jy,kz;\n int ip;\n};\nParticle particles[GL];\nint GetIndex(const Particle & p){return (p.ix+cuba+cubn*(p.jy+cuba+cubn*(p.kz+cuba)));} \n...\n#pragma omp parallel for\nfor(int i=0; i<cub3; ++i) Length[i]=Counter[i]=0;\n#pragma omp parallel for\nfor(int i=0; i<N; ++i)\n{\n int ic=GetIndex(particles[i]);\n #pragma omp atomic update\n Length[ic]++;\n}\nBegin[0]=0;\n#pragma omp single\nfor(int i=1; i<cub3; ++i) Begin[i]=Begin[i-1]+Length[i-1];\n#pragma omp parallel for\nfor(int i=0; i<N; ++i)\n{\n if(particles[i].ip==3)\n {\n int ic=GetIndex(particles[i]);\n if(ic>cub3 || ic<0) printf("ic=%d out of range!\\n",ic);\n int cnt=0;\n #pragma omp atomic capture\n cnt=Counter[ic]++;\n MIndex[Begin[ic]+cnt]=i;\n }\n}\n …Run Code Online (Sandbox Code Playgroud) 有一个正常工作的代码:
#include <iostream>
int sum_odd_digits(int n)
{
if(n==0) return 0;
else return (((n%2)!=0)?n%10:0) + sum_odd_digits(n/10);
}
int main(int argc, char ** argv)
{
std::cout<<sum_odd_digits(25897641)<<std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是如果要去掉外括号,即替换
else return (((n%2)!=0)?n%10:0) + sum_odd_digits(n/10);
Run Code Online (Sandbox Code Playgroud)
和
else return ((n%2)!=0)?n%10:0 + sum_odd_digits(n/10);
Run Code Online (Sandbox Code Playgroud)
程序开始给出错误的输出结果,即开始不正确地工作。
为什么?这两条线有什么区别?