c语言!求分析这个表达式……

main()
{
int x=5, y;
y=2+(x+=x++,x+8,++x);
printf(\"\\n%d\",y);
}
第四行的表达式不是应该先算x++?x=5,x++先使用后自加。所以(x++)为5,x变成了6!然后x=x+(x++)也就是11=6+5。x+8没有意义,然后算++x。所以是11自加变成12.然后12+2=14.所以y=14.对么??????
我的思路对么???求分析

  算法( Algorithm ):计算机解题的基本思想方法和步骤。
  算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。通常使用自然语言、结构化流程图、伪代码等来描述算法。
  计数、求和、求阶乘等简单算法 , 此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件,更要注意用来表示计数、和、阶乘的变量的初值。
  1. 用随机函数产生 100 个 [0 , 99] 范围内的随机整数,统计个位上的数字分别为 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 的数的个数并打印出来。
  本题使用数组来处理,用数组 a[100] 存放产生的确 100 个随机整数,数组 x[10] 来存放个位上的数字分别为 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 的数的个数。即个位是 1 的个数存放在 x[1] 中,个位是 2 的个数存放在 x[2] 中,……个位是 0 的个数存放在 x[10] 。
  void main()
  { int a[101],x[11],i,p;
  for(i=0;i<=11;i++)
  x[i]=0;
  for(i=1;i<=100;i++)
  { a[i]=rand() % 100;
  printf("%4d",a[i]);
  if(i%10==0)
  printf("\n");
  }
  for(i=1;i<=100;i++)
  { p=a[i]%10;
  if(p==0) p=10;
  x[p]=x[p]+1;
  }
  for(i=1;i<=10;i++)
  { p=i;
  if(i==10) p=0;
  printf("%d,%d\n",p,x[i]);
  }
  printf("\n");
  }
  2. 求两个整数的最大公约数、最小公倍数
  分析:求最大公约数的算法思想: ( 最小公倍数 = 两个整数之积 / 最大公约数 )
  (1) 对于已知两数 m , n ,使得 m>n ;
  (2) m 除以 n 得余数 r ;
  (3) 若 r=0 ,则 n 为求得的最大公约数,算法结束;否则执行 (4) ;
  (4) m ← n , n ← r ,再重复执行 (2) 。
  例如 : 求 m=14 ,n=6 的最大公约数 .
  void main()
  { int nm,r,n,m,t;
  printf("please input two numbers:\n");
  scanf("%d,%d",&m,&n);
  nm=n*m;
  if (m<n)
  { t=n; n=m; m=t; }
  r=m%n;
  while (r!=0)
  { m=n;
  n=r;
  r=m%n;
  }
  printf(" 最大公约数 :%d\n",n);
  printf(" 最小公倍数 :%d\n",nm/n);
  }
  3. 验证哥德巴赫猜想
  (任意一个大于等于 6 的偶数都可以分解为两个素数之和)
  基本思想: n 为大于等于 6 的任一偶数,可分解为 n1 和 n2 两个数,分别检查 n1 和 n2 是否为素数,如都是,则为一组解。如 n1 不是素数,就不必再检查 n2 是否素数。先从 n1=3 开始,检验 n1 和 n2 ( n2=N-n1 )是否素数。然后使 n1+2 再检验 n1 、 n2 是否素数,… 直到 n1=n/2 为止。
  利用上面的 prime 函数,验证哥德巴赫猜想的程序代码如下:
  #include "math.h"
  int prime(int m)
  { int i,k;
  k=sqrt(m);
  for(i=2;i<k;i++)
  if(m%i==0) break;
  if(i>=k)
  return 1;
  else
  return 0;
  }
  main()
  { int x,i;
  printf("please input a even number(>=6):\n");
  scanf("%d",&x);
  if (x<6||x%2!=0)
  printf("data error!\n");
  else
  for(i=2;i<=x/2;i++)
  if (prime(i)&&prime(x-i))
  {
  printf("%d+%d\n",i,x-i);
  printf(" 验证成功 !");
  break;
  }
  }
  4. 选择法排序(升序)
  基本思想:
  1 )对有 n 个数的序列(存放在数组 a(n) 中),从中选出最小的数,与第 1 个数交换位置;
  2 )除第 1 个数外,其余 n-1 个数中选最小的数,与第 2 个数交换位置;
  3 )依次类推,选择了 n-1 次后,这个数列已按升序排列。
  5. 冒泡法排序(升序)
  基本思想: ( 将相邻两个数比较,小的调到前头 )
  1 )有 n 个数(存放在数组 a(n) 中),第一趟将每相邻两个数比较,小的调到前头,经 n-1 次两两相邻比较后,最大的数已“沉底”,放在最后一个位置,小数上升“浮起”;
  2 )第二趟对余下的 n-1 个数(最大的数已“沉底”)按上法比较,经 n-2 次两两相邻比较后得次大的数;
  3 )依次类推, n 个数共进行 n-1 趟比较,在第 j 趟中要进行 n-j 次两两比较。
  6. 合并法排序(将两个有序数组 A 、 B 合并成另一个有序的数组 C ,升序)
  基本思想:
  1 )先在 A 、 B 数组中各取第一个元素进行比较,将小的元素放入 C 数组;
  2 )取小的元素所在数组的下一个元素与另一数组中上次比较后较大的元素比较,重复上述比较过程,直到某个数组被先排完;
  3 )将另一个数组剩余元素抄入 C 数组,合并排序完成。
  程序段如下:
  void main()
  { int a[10],b[10],c[20],i,ia,ib,ic;
  printf("please input the first array:\n");
  for(i=0;i<10;i++)
  scanf("%d",&a[i]);
  for(i=0;i<10;i++)
  scanf("%d",&b[i]);
  printf("\n");
  ia=0;ib=0;ic=0;
  while(ia<10&&ib<10)
  { if(a[ia]<b[ib])
  { c[ic]=a[ia]; ia++; }
  else
  { c[ic]=b[ib]; ib++; }
  ic++;
  }
  while(ia<=9)
  { c[ic]=a[ia];
  ia++; ic++;
  }
  while(ib<=9)
  { c[ic]=b[ib];
  b++; ic++;
  }
  for(i=0;i<20;i++)
  printf("%d\n",c[i]);
  }
  7. 顺序查找法(在一列数中查找某数 x )
  基本思想:一列数放在数组 a[1]---a[n] 中,待查找的数放在 x 中,把 x 与 a 数组中的元素从头到尾一一进行比较查找。用变量 p 表示 a 数组元素下标, p 初值为 1 ,使 x 与 a[p] 比较,如果 x 不等于 a[p] ,则使 p=p+1 ,不断重复这个过程;一旦 x 等于 a[p] 则退出循环;另外,如果 p 大于数组长度,循环也应该停止。(这个过程可由下语句实现)
  void main()
  { int a[10],p,x,i;
  printf("please input the array:\n");
  for(i=0;i<10;i++)
  scanf("%d",&a[i]);
  printf("please input the number you want find:\n");
  scanf("%d",&x);
  printf("\n");
  p=0;
  while(x != a[p] && p < 10)
  p++;
  if(p >= 10)
  printf("the number is not found!\n");
  else
  printf("the number is found the no%d!\n",p);
  }
  思考:将上面程序改写一查找函数 Find ,若找到则返回下标值,找不到返回 -1
  基本思想:一列数放在数组 a[1]---a[n] 中,待查找的关键值为 key ,把 key 与 a 数组中的元素从头到尾一一进行比较查找,若相同,查找成功,若找不到,则查找失败。 ( 查找子过程如下。 index :存放找到元素的下标。 )
  void main()
  { int a[10],index,x,i;
  printf("please input the array:\n");
  for(i=0;i<10;i++)
  scanf("%d",&a[i]);
  printf("please input the number you want find:\n");
  scanf("%d",&x);
  printf("\n");
  index= -1;
  for(i=0;i<10;i++)
  if(x==a[i])
  { index=i; break;
  }
  if(index == -1)
  printf("the number is not found!\n");
  else
  printf("the number is found the no%d!\n",index);
  }
  8. 折半查找法(只能对有序数列进行查找)
  基本思想:设 n 个有序数(从小到大)存放在数组 a[1]----a[n] 中,要查找的数为 x 。用变量 bot 、 top 、 mid 分别表示查找数据范围的底部(数组下界)、顶部(数组的上界)和中间, mid=(top+bot)/2 ,折半查找的算法如下:
  ( 1 ) x=a(mid) ,则已找到退出循环,否则进行下面的判断;
  ( 2 ) x<a(mid) , x 必定落在 bot 和 mid-1 的范围之内,即 top=mid-1 ;
  ( 3 ) x>a(mid) , x 必定落在 mid+1 和 top 的范围之内,即 bot=mid+1 ;
  ( 4 )在确定了新的查找范围后,重复进行以上比较,直到找到或者 bot<=top 。
  将上面的算法写成如下程序:
  void main()
  {
  int a[10],mid,bot,top,x,i,find;
  printf("please input the array:\n");
  for(i=0;i<10;i++)
  scanf("%d",&a[i]);
  printf("please input the number you want find:\n");
  scanf("%d",&x);
  printf("\n");
  bot=0; top=9; find=0;
  while(bot < top && find == 0)
  { mid=(top+bot)/2;
  if(x==a[mid])
  { find=1; break; }
  else if(x < a[mid])
  top=mid-1;
  else
  bot=mid+1;
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-06-10
分析
执行顺序 x值
x=5 5
x+=x 10
x++ 11
x+8 11
++x 12 (此时y=2+x=14)

例证
int x=5, y,z=3;
y=2+(x+=z++,x+8,++x);
输出y为11 x为9 z为4本回答被提问者采纳
第2个回答  2012-06-10
不对哦,首先这是一个逗号表达式 x+8有意义哦 从左到右算,x++优先级高 所以先使用后自加x=6 然后x=x+(x++)也就是11=6+5, x变11了然后x+8=19 ,然后算++x,这样y=22

c语言!求分析这个表达式……
分析:求最大公约数的算法思想: ( 最小公倍数 = 两个整数之积 \/ 最大公约数 )(1) 对于已知两数 m , n ,使得 m>n ;(2) m 除以 n 得余数 r ;(3) 若 r=0 ,则 n 为求得的最大公约数,算法结束;否则执行 (4) ;(4) m ← n , n ← r ,再重复执行 (2) 。例如...

c语言求详尽分析:int a=1,b=2;b==a=2;判断真假?本人认为为0但与答案不...
int a=1,b=2;b==a=2; \/\/这个是逻辑表达式,表示b==(a=2),判别b与a=2这两个表达式的值是否相等,因为相等,故结果为真,以整数输出是1。

C语言程序求分析,最好每行都详细说明下,尤其是中间2行for循环读着很乱...
这个程序出现了不止一处错误,下面逐个指出:1.双重循环对for语句在表达式括号后面不要加;(分号,能看见吧?),你加了分号意味着for不做任何动作,这是合法但是毫无意义的。所以你的程序只是执行了*q=*p;*q=‘\\0';printf三句,而str2根本未初始化!那么打印出来的东西是未知的或者是空。2.解决...

C语言中!的意思是什么啊?
在 C 语言中,"!" 是逻辑取反运算符。它的作用是将一个布尔表达式的值取反,例如:int a = 1;int b = 0;if (!a) { \/\/ 这里的代码不会执行 } if (!b) { \/\/ 这里的代码会执行 } 在这个例子中,变量 a 的值为真,所以逻辑取反后的值为假,不会执行后面的代码。变量 b 的值为...

c语言求分析:int a=0;if(a=1)a+=10:计算a值,请详尽分析!
int a = 0;\/\/定义变量a并初始化为0 if (a = 1) \/\/给a赋值1,赋值语句返回1,if条件成立 a += 10;\/\/做运算 a+=10相当于 a = a+10 = 1+10 = 11;

c语言中!表示什么
c语言中!表示逻辑运算中的非运算。“!”是C语言中的非运算符,在变量前面使用它,会构建非运算表达式,表达式的返回结果是个布尔值(也就是只有true或false)。对变量使用时,如果变量不是布尔数据类型,将会强制转化为布尔类型再使用,如整形变量123将被转化为true,整形变量0将被转化为false。C语言:...

c语言问题如图,求分析
strlen(str1) 是指str1的字符串长度,是6个字节(因为是数组赋值,会在结尾自动加'\\0'),sizeof(str2)是指str2的变量大小,str2是一个指针,占4个字节 printf("%d %d\\n", strlen(str2), sizeof(str2));输出结果是 5 4 strlen(str2)是指str2的字符串长度,但是str2不是数组赋值,...

c语言基础问题求解 求详细分析此段代码 中a[++1]=2*i+1的意思 急!!
c语言基础问题求解 求详细分析此段代码 中a[++1]=2*i+1的意思 急!!a[i++]=2*i+1; 这一句实际上可分成以下三步:一、求2*i+1;二、将上面计算的结果赋给a[i];三、变量i自增1,即i++;由于在for(i=0;i<10;i++)

这个c语言表达式结果为什么是4?急求
这是“逗号”表达式。“逗号”表达式, 先从左到右走一遍,最后结果等于 最右边的表达式的结果。例如:x = (a+b,18+(b=4)*3,(a\/b,a%b));执行:(1) a+b (2) 18+(b=4)*3 (3) (a\/b,a%b)分成 a\/b a%b --- x 结果 是 a%b 的 结果。由于你前面没有给出 a,b 的初值...

C语言题目求详细解答 表达式~0x13的值是 A.0xFFEC B.0xFF71 C.0xFF68...
0x是16进制的数字 0x13换算成二进制数是:10011 把10011补齐是:0000 0000 0001 0011 然后按位取反是:1111 1111 1110 1100(呵呵,按位取反就是同一位上的0变1,1变0)换算成16进制: F F E C 所以:选择 A

相似回答