1. C语言,i--和--i有什么区别,怎么用
--i和i--都是自减运算符
--i称为前缀运算,i--称为后缀运算
前缀运算后,表达式的值为原变量值减1;
后缀运算后,表达式的值仍为原变量值;
而变量值不论前缀运算还是后缀运算都减1。
例如:i=10;
--i的值为原变量值减1,是9;现在的变量i也是9
i=10
i--的值为原变量值,是10;而变量i现在就是9
2. C语言中,前缀运算和后缀运算有什么区别呀!
前缀是运算后返回的是原值,后缀是运算后返回结果值
3. C语言中 x/=2 怎么理解
C语言中提供了自增1运算符++和自减1运算符--
而且,这两种运算符,还分为前缀运算和后缀运算
如:
int a=5;
a++; //后缀运算,表示a=a+1 = 5+1=6
a--; //后缀运算,表示a=a-1 = 6-1=5
--a; //前缀运算,表示a=a-1 = 5-1=4
++a; //前缀运算,表示a=a+1 = 4+1=5
以上单独使用自增1或自减1运算符,前缀运算和后缀运算没有区别,其结果都是完成变量a的自加1或自减1
前缀运算和后缀运算的区别在于:前缀运算,先运算,再使用变量;后缀运算,先使用变量,再运算。如:
int a=5;
printf("a=%d\n", ++a ); //前缀运算,先运算a=a+1=5+1=6,再使用变量a,输出结果a=6
a=5; //重新赋值为5
printf("a=%d\n", a++ ); //后缀运算,先使用变量a,输出结果a=5,再运算a=a+1=5+1=6
void main(){
int x = 6, y = 5;
printf("%d\n",++x+y++); //以下代码表面看有区别,实际都是一样的,先执行++x 然后结果+y,然后y++。 ++的结合性要优于+,所以,解题时,先找++的参与变量,再找其它运算符的参与变量
printf("%d\n",++ x+y++);
printf("%d\n",++x +y++);
printf("%d\n",++x+ y++);
printf("%d\n",++x+y ++);
printf("%d\n",++x+y++ );
}
4. 如何在一个C语言程序中实现重复计算
只要设个循环就可以了
#include
<stdio.h>
main()
{
int
a,
b;
char
end='
';
while(end!='q')
{
scanf("%d
%d",
&a,
&b);
printf("%d\n",
a
+
b);
getchar();
end=getchar();
}
}
就这样了按q退出
按其他键继续计算
第一个getchar()是为了消除你在输入2个数字之后按的那次回车
5. C语言代码补全:前缀表达式求值
思路:这里实际是把前缀表达式逆序输出转化为类似后序表达式求值:
比如:
输入:++2*3-74/84处理成48/47-3*2++链表,放到后缀表达式求值程序postFixEval计算得
13.0
#include<stdio.h>
#include<stddef.h>
#include<string.h>
#include<stdlib.h>
#defineMAXSIZE100
//用链表实现前缀表达式,
typedefstructNode
{
union
{charexp;
inta;
}data;
structNode*next;
structNode*prev;
}Node;
intisExpression(inttmpExp){
if(tmpExp=='+'||tmpExp=='-'||tmpExp=='/'||tmpExp=='*'||tmpExp=='('||tmpExp==')')
return1;
else
return0;
}
intisSuperior(inttmpExp,inttmpExp2){
if(tmpExp2=='('||(tmpExp=='/'||tmpExp=='*'))//tmpExp2=='('||(tmpExp=='/'||tmpExp=='*')&&(tmpExp2=='+'||tmpExp2=='-')
return1;
else
return0;
}
voidprintNode(Node*node)
{
if(node)
{chartmpExp=node->data.exp;
if(isExpression(tmpExp))
printf("%c",node->data.exp);
else
printf("%d",node->data.a);
if(node)
printNode(node->next);
}
}
typedefstructStack2
{doublearr[MAXSIZE];
inttop;
}Stack2;
voidpush(doublenum,Stack2*stack)
{if(stack->top>=MAXSIZE)
return;
else
{stack->top++;
(stack->arr[stack->top]=num);
}
}
doublepop(Stack2*stack)
{doubleret;
if(stack->top<=-1)
return-1;
else
{ret=stack->arr[stack->top];stack->top--;}
returnret;
}
//后缀表达式求值程序
doublepostFixEval(Node*head)
{doubleval=0;
Node*node=head;
Stack2stack2;
stack2.top=-1;
while(node)
{
if(!isExpression(node->data.exp))
{
push(node->data.a,&stack2);
}
else
{
doubleop1=pop(&stack2);
doubleop2=pop(&stack2);
switch(node->data.exp)
{
case'+':
val=op1+op2;
break;
case'-':
val=op1-op2;//注意是op1/op2
break;
case'*':
val=op1*op2;
break;
case'/':
val=op1/op2;//注意是op1/op2
break;
}
push(val,&stack2);
}
node=node->next;
}
returnval=pop(&stack2);
}
intmain(intargc,char*argv[])
{
Node*head=0;
inti=0,length=0;
charbuf[1024];
char*tmpExp,sep[]="";
char*p=NULL;
//head=(Node*)malloc(sizeof(Node));
//head->data.exp='';
//head->data.a=0;
//head->next=0;
gets(buf);
tmpExp=buf;
Node*tmpExpNode=head;
//输入为前缀表达式
while(p=strtok(tmpExp,sep))
{
Node*node=(Node*)malloc(sizeof(Node));
node->next=0;
//printf("%s",p);pisapointtostring(notapointtoachar)
if(strcmp(p,"+")==0||strcmp(p,"+")==0||strcmp(p,"-")==0||strcmp(p,"*")==0||strcmp(p,"/")==0||strcmp(p,"(")==0||strcmp(p,")")==0)
sscanf(p,"%c",&node->data.exp);
else
sscanf(p,"%d",&node->data.a);
node->next=tmpExpNode;//逆转输入的前序表达式,即后输入的在前
tmpExpNode=node;
tmpExp=0;
}
printf("%0.1f ",postFixEval(tmpExpNode));//0.1f表示一位小数
return0;
}