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

供稿:hz-xin.com     日期:2025-01-13
c语言中分析此表达式,求出表达式的值及变量i,j,k的值(变量初值i=1,j=4,k=5),i=++j,j=++k 求详细解答

首先要理解 前++的意思是 先加1,再使用,即:++i 可分成两个表达式:i=i+1 , i
按此思想去分析:
i=1,j=4,k=5

i=++j, 运行后,先算j=j+1=5, 然后i=j=5
j=++k 先算k=k+1=6, 然后j=k=6

预编译
主函数
定义整形变量 i r x y
赋值y=0
输入x的值
循环到i≠0
。。。
剩下同理可得不难

  算法( 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;

分析
执行顺序 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

不对哦,首先这是一个逗号表达式 x+8有意义哦 从左到右算,x++优先级高 所以先使用后自加x=6 然后x=x+(x++)也就是11=6+5, x变11了然后x+8=19 ,然后算++x,这样y=22

这个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 的初值...

...这个怎么做求A,B,C,D的值,要具体分析啊谢谢啦。。
具体点啊:a=1;这是赋值表达式 对a 赋值为1 b=2;这是赋值表达式 对b 赋值为2 c=3;这是赋值表达式 对c 赋值为3 d=(a++,--b,b--,--a,--c,c--); 这个归根也是赋值表达式,是把右面的逗号表达式的值赋给d..逗号表达式:从左向右依次运算,整个逗号表达式的值为最右侧的值 所以,...

C语言 int x=2,表达式x*=x+1与x*(x+1)值都是6么 求分析
是的 这两个表达式的值都是6 区别是:x*=x+1表达式值是6,x值也是6 x*(x+1)表达式值是6,x值是2

...这段表达式到底什么意思啊。这个表达式的值是多少啊
a+=b<c等价于a=a+(b<c),注意复合赋值运算表达式+=,-=,*=,\/=,%=都等价于 变量自身与右边的表达式运算,注意右边的表达式是独立的,也就是右边的表达式是一个整体,要加上括号,因此a+=b<c等价于a=a+(b<c),变量a的值等于a加上关系比较表达式b<c的值,看看b<c成立吗,如果成立,...

关于c语言的一个问题:看这个表达式a=~b&c
表达式 "a=~b&c" 中的运算符优先级决定了其计算顺序。优先级从高到低排列如下:单目运算符、双目运算符、赋值运算符。单目运算符包括:~(按位取反运算符)、-(负号运算符)、-(自减运算符)、++(自增运算符)、*(取值运算符)、&(取地址运算符)、!(逻辑非运算符)。双目运算符包括:+...

c语言当中,这个表达式该怎么求 d=a>b?(a>c?a:c):(b);
先比较a是否大于b,不大于的话表达式就直接等于b,大于b的话再计算小括号里面的(a>c?a:c),就是当a大于c的时候返回a,a小于等于c的时候等于c,大概就这样

大家好,请问C语言中这个题目怎么做啊?
y=10 ; 没什么疑问 x=y-=5,45\/y ;问题应该在这里 这个表达式是一个逗号表达式 你先将这个表达式用括号括起来,即(x=y-=5,45\/y )那么这个逗号表达式的值就是括号内最后一个逗号后面的那个表达式的值。也就是说 如果再定义一个变量num=(x=y-=5,45\/y );那么num的值就是等于45...

...答案为错,求高手解释。谢谢(主要是不明白表达式的“!”作用是什么...
???表达式的值为1吧 d=1,e=2,f=3 首先注意它们优先级,所以 !(d+e)+f&&e+f*2 => !(1 + 2) + 3 && 2 +3 * 2 => !3 + 3 && 2 + 6 => 0 + 3 && 8 => 3 && 8 =>1

C语言第五题怎么做,求解释!
5.选B 分析:(!x||y--) 首先,计算!x,因为x=1,在C语言中,非0表示逻辑真 ,作非运算,结果是逻辑假,即0。 然后,计算||右边的表达式y--,结果为1。最后相当于0||1,结果为1。即最终表达式的结果。因此,选 B。

C语言中这个表达式怎么算
答案是 -6.6 吧?a-b%3*(int)(a+b)\/4 关键是*(int)(a+b)\/4 意思是a+b除以4的值(5.1)浮点型 强制改为整型,所以就为 5 了;b%3 是 求余 运算 7%3 的 余数 是4 最后的 关系是:13.4-4*5=-6.6