Ⅰ 关于c语言的自加自减运算
具体分析:
首先须知: a++ 就是a先做其他运算,再做自加运算比如 a++*b a与b相乘5*8=40 然后a自加=6
++a 是a先做自加运算,再做其他运算,比如 ++a*b a先加得到7=6+1,然后再与b相乘,7*8=56
a--和--a也是同理。
然后自减的情况 a*b=7*8=56 然后a自减 7-1=6
然后a先自减 a=6-1=5 然后与b相乘 a*b=5*8=40
不知说明白吗?
楼主须区分优先级和自加减的情况,自加减的优先级和单目运算相同。
其次,自加减操作情况有时不同,如题所见,须特别分析。
最后,自加减的情况一般很少参与运算,比如 d=++a+a++ 不太出现似乎。
Ⅱ C语言自增自减运算符
楼上说的对,单主要还是要看While的语句,才是循环条件,题目种的,do执行的b的±,while执行a的±,只看a就行,
循环一次a加1,加到0结束循环。
所以a的初值一定要是负数,才有可能加到0,不然死循环
-2可以循环2次,
Ⅲ C语言的自加自减运算符
这两个都是未定义行为,因为(y++)+(y++)+(y++)里面没有顺序点,所以你无法保证执行完第一个y++之后,y的值是否增加了,如果增加了,那么第二个y++就会是6。
只有顺序点才能确定一个副作用被实现,在这里,副作用就是确保y++之后,y加1。
下面的那个++y亦是同理。
至于什么是顺序点,可以参考这个:
C/C++语言定义(语言的参考手册)明确定义了顺序点的概念。顺序点位于:
1. 每个完整表达式结束时。完整表达式包括变量初始化表达式,表达式语句,return语句的表达式,以及条件、循环和switch语句的控制表达式(for头部有三个控制表达式);
2. 运算符 &&、||、?: 和逗号运算符的第一个运算对象计算之后;
3. 函数调用中对所有实际参数和函数名表达式(需要调用的函数也可能通过表达式描述)的求值完成之后(进入函数体之前)。
Ⅳ C语言自加自减问题~~~~
我举个例子吧,你看看:
#include<stdio.h>
void
main()
{
int
i=2;
printf("%d,%d,%d,%d,\n",i++,++i,i,i++);
printf("%d\n",i);
}
首先,应该说明的是在不同的编译环境中结果是不一样的。
关于本段代码在VC++6.0中的规则如下:
1、printf函数的执行顺序是由右到左的
2、前自增运算符(++i)先加1,再使用i,此时i已经加了1;
3、后自增运算符(i++)先使用i,再加1,***注意这里是关键所在,VC++6.0后自增运算是要在整条语句结束以后才自加1的,(VC++6.0比较变态)***
所以:
printf("%d,%d,%d,%d,\n",i++,++i,i,i++);
从右往左运算:
i++得到2(i=2,后加1在整条语句执行完才进行,这里先记下)
i还是2
(i=2,原因见上一行)
++i得到3(i=3,先加1,后使用)
i++得到3(i=3,后加1在整条语句执行完才进行,这里先记下)
所以输出结果为:3,3,2,2
然后计算刚才的两次后自增运算后,i=5
printf("%d\n",i);
所以,结果是5
Ⅳ C语言中自加自减的问题
第一,y[j++]= x[i]; 等效于 y[j]= x[i]; j++; 前者只是比较紧凑的写法,话说这也是后加的典型用法。
第二,y[j]-=1怎么会有语法错误,它是把指针y指向的下标为j的元素的值赋为-1.这里的-号是指正负的负,而不是减法的意思。
第三,-1的意思只是做一个标记,在这个代码的里的意思是表示数据结束了,后面没有数据了的意思。具体看 for(i=0; y[i]>=0; i++) printf("%5.1f ",y[i]); 看看循环终止条件就应该明白了。不过这样的做法挺垃圾,不推荐这么搞。
Ⅵ 什么是C语言中关于自加自减
自增分前缀自增和后缀自增。无论是什么,执行自增都有1个副作用,就是原来变量的值会增加1。例如int a=1;a++;或int a=1;++a;执行后,a==2。
而他们的区别就在于整个自增表达式的值不同。如(a++)的值是变量a自增以前的值,如上面例子,(a++)==1。而(++a)的值则是变量a自增以后的值,即(++a)==1+1==2。
结合性分为左结合和右结合,只有优先级相同时才看结合性,例如表达式a+b*c+d-e*f,因为乘法优先级别高于加减,所以a+(b*c)+d-(e*f),又因+-运算是左结合,所以只a+(b*c)再(a+(b*c))+d再(a+(b*c)+d)-(e*f),假如是右结合,就先d-(e*f),也就反过来了。这里其实看不出有什么区别,怎么样结果都一样。
但看到*p++运算就不同了,因为*与++运算同一优先级,左结合结果就是(*p)++,右结合就是*(p++),这是区别很大的,书上还很多例子,你可以自己去看的。
强制转换问题就是在可以转换的情况下按要求转换。如float x=9.9;
则(int)x==9。将实型转为整型是采用截掉小数部分的做法。
例如还可以整型转字符常量等等,例如,int a=97;则(char)a=='a',因为字符a的ASCLL码为97。
()里面即是你要转换的类型。
Ⅶ c语言的自加自减问题。。。
结果是8没错,在这里采用的是do......while()的循环结构,至少执行一次,在程序开头,分别给c和k赋了初值,使c='A',k=0,在执行循环语句时是这样一个流程:
switch后的表达式(c++)先将'A'用来与case后的常量表达式结果比较后再自增使c='B',此时用于比较的是c自增前的值,满足第一种情况,执行k++,然后跳出switch结构,执行k++,第一次循环结果为k=2,然后判断c是否小于'G',第一次自增后的c的值为'B',小于'G',所以执行第二次循环,c++,将'B'拿去与case后的常量表达式判断,c自增变为'C',此时满足switch语句中的第二个条件,执行k--,又因为其后没有终止语句,继续执行k+=2,跳出switch结构,执行k++,此次循环结束结构为k=4,依次执行第三次循环,第四次循环,第五次循环,第六次循环,结果分别为7,2,21,8。
总的来说,在这个程序中与要注意的有以下几点:
1.对自增自减的理解,切记诸如 i++ 一类的是先赋值,在自增,也就是先将原来的值用于参加运算,再使自身加一, i--是同一个道理,而++i ,--i 则刚好相反,是先自增,再赋值。
2.在switch结构中,每一个case后的常量表达式的值都应不同,不然就自相矛盾了,而至于在case语句后是否要跟一个终止语句,则要按情况来决定,如果没有终止语句,则要依次执行下去直到遇见终止语句或语句末尾为止。
3.这个程序在自己估算结果时,只有两种情况,因为在执行k=k%2时只有两个结果,1和0,从这也只能得到两个值,而真实结果也只能是这两个值中的一个。
希望这能帮助你。
Ⅷ c语言中自加自减怎么运算
自加++自减--运算的数据类型可以是Float和Double。
在c语言中,并不是所有变量都可以使用自增自减操作符;可以使用自增自减操作符的数据类型有:int、float、double 、char、long。
自增(++) :将变量的值加1,分前缀式(如++i) 和后缀式(如i++) 。前缀式是先加1再使用;后缀式是先使用再加1。
自减(--):将变量的值减1, 分前缀式(如--i)和后缀式(如i--)。前缀式是先减1再使用;后缀式是先使用再减1。
(8)c语言加到满足条件进行自减运算扩展阅读
自增与自减运算符还遵循以下规律:
1、可以用于整数类型byte、 short、 int、 long, 浮点类型float、 double,以及字符串类型char
2、在Java5.0及以上版本中,它们可以用于基本类型对应的包装器类Byte、Short、Integer、 Long、 Float、 Double、Character
3、它们的运算结果的类型与被运算的变量的类型相同。
前自增自减操作优先级大于赋值运算符(=),而后置自增自减操作的优先级小于赋值运算符,后自增自减操作后表达式的值不会发生改变。指针的自增自减是将指针所指的地址加1或减1的操作。
Ⅸ C语言自加自减问题
计算:从右往左,并输出到“缓冲区”。
1、缓冲区是一堆栈
2、第一步:处理后面的“i--”。8进入缓冲区,i=7。缓冲区:8 <-(指针)
第二步:处理“i++”。7进入缓冲区,i=8。缓冲区:7 8<-
第三步:处理”--i“。8进入缓冲区,i=7.缓冲区:8 7 8
第四步:处理“++i” 先自增1,然后8进入缓冲区,i=8 .缓冲区: 8 8 7 8
3、输出缓冲区数据(栈规则):8 8 7 8
另外自增 、自减 、还可能和编译器有关系 。
(9)c语言加到满足条件进行自减运算扩展阅读:
后缀表达式 2级
postfix-expression [ expression ],数组下标运算。
postfix-expression ( argument-expression-list),函数调用,括号内的参数可选。
postfix-expression . identifier,成员访问,
postfix-expression -> identifier,成员访问,->号之前应为指针。
postfix-expression ++,后缀自增
postfix-expression --,后缀自减
( type-name ) { initializer-list }
( type-name ) { initializer-list , } 复合初始化,C99后新增。
Ⅹ C语言自加自减运算
从左往右看,比如++m,就是m的值先自加1,再调用,而m++就是先调用m,再自加1. 举个例子 #include <stdio.h> main() { int a=1,b=1; printf("%d,%d",++a,b++); //输出就是2,1 } a的值先自加1,再调用,而b++就是先调用m。 --m m-- 同样的意思,只不过是减法而已