⑴ 关于c语言自增运算符的问题
运行以下代码,可能会帮你理解
intmain()
{
intcount=0;
printf("%d%d%d ",count++,count++,count++);
printf("%d ",count);//后缀,先使用变量,待本语句结束后(遇到分号后),其值才会真正进行改变!
count=0;
printf("%d%d%d ",++count,++count,++count);//printf参数输出,从右向左(在我的机器上是这样,也许不同机器有不同),前缀,先改变变量,后使用变量
printf("%d ",count);
count=0;
printf("%d%d%d ",count++,++count,count++);
printf("%d ",count);
return0;
}
⑵ 关于C语言自增问题
第一题挺简单的,++优先级是很高的(所有单目运算符的优先级都很高,仅次于扩号),所以要在所有++运算完之后再运算+法,也就是说,在运算+之前,i已经进行了两次自増,由3增到了5,然后再相加,k当然就等于10了。
第二题,你是不是看错题了?或者书印刷错误?这个k的值应该是8啊。C语言采用的是“最长匹配原则”,也就是在保证表达式有意义的前提下,从左到右尽可能多地将字符组成一个运算符,所以i+++(++i)等于是(i++)+(++i);i++是先引用后自増,运算完i++后,i变成4,但是i++表达式的值却是3,然后接着运算++i,这时是先自増后引用,i=4的前提下自増,i就变5了,所以++i的表达式的值是5,然后运算+法,所以之后,k=8,i=5。
⑶ c语言中的自增运算
首先++优先级大于+
所以等价于:int
y=(++a)+(a++)+(a++);
前置++,先加1后返回亏誉值。
后置++,先销盯段返回值后加1。
(++a)=1(执行完后,此时a的值为1)
然后a++,先返回a的值,所以(++a)+(a++)=2(执行完后,此时a的值为2)。
所以(++a)+(a++)+(a++)=4(执行完后则行,此时a的值为3)
⑷ C语言关于自增的问题
标题可能有误,如果是C++的话,一切没问题;但是C语言中,如果按现在编译器一般支持的ANSI C89/ISO C90标准,以上ABCD是全错的(原因下面再讲);如果是C99标准,那么同C++。
C/C++中一个表达式可以是左值(lvalue),表示在实现中具有对应的运行期空间。从一般的C/C++实现而言,等价于保证在程序运行时必定存在一段内存中保存了左值的值(类型不会被保存)。(lvalue的l表示location之意,暗示可以作为一元操作符&的操作数;或者left,暗示这个表达式可以作为赋值操作符=的左操作数。)对于前置或后置的++、--,同赋值操作符=同样,要求操作数必须是一个左值。而算术表达式和后置++、--表达式都不是左值,编译器无法确定改写这个值需要的指令作用的存储器位置从而实现它的值进行++、--操作,因此ACD会引起编译错误。C++中前置++、--的返回值是左值,因此只要B选项中p是在所在作用域中定义过的非const的可访问的变量,就是正确的表达式。
C语言中,括号()不改变表达式的左值属性;一元运算符*、下标运算符[]返回左值;序列运算符(逗号表达式)返回左值但是deprecated(可能会被标准的以后版本废除);其它如函数调用表达式,自增、自减、算术、逻辑、比较、赋值表达式等返回的都不是左值,所以ABCD都错。
====
[原创回答团]
⑸ c语言自增问题,优先级
关于自增的优先级,简单的可以这样理解:
a++; printf("%d ",a++); =>可以看做先printf("%d ",a); 然后再执行a=a+1;如果现在继续输出printf("%d ",a);你就可以发现最后这个a的值是上一个a值多加了1;
++a; printf("%d ",++a); =>可以看做先a=a+1;然后再执行printf("%d ",a);如果现在继续输出printf("%d ",a);你就可以发现最后这个a的值根上一个a值相等;
a--; printf("%d ",a--); =>可以看做先printf("%d ",a); 然后再执行a=a-1;
--a; printf("%d ",--a); =>可以看做先a=a-1;然后再执行printf("%d ",a);
下面是我举的例子(在vc++6.0运行的),可以帮助理解
---------- 2019.07.03 ----------
今天看到这道题,发现当年并没有细分析出执行结果,现做出一下补充:
x 值计算要这样分析:(编译器逻辑有下面基本逻辑)
1. "花括号操作符" 优先级大于 "加号操作符"
2. 两个连续的 "加号操作符" 执行时先执行第一个
3. 后自增只会在当前的所有操作执行完毕后才执行 (这一点是 x 值最重要的一点)
故需要将 x 分成两大部分执行
一、(a++) + (a++) => 根据上面逻辑1和逻辑2两点可以得到此时 a = 8; 第一部分得到 16; 此时要注意要符合 (逻辑3) 的要求 a 的后自增还未执行(后面还有加号操作)
二、16 + (a++) => 第二部分这里和容易可以看出就是先执行 16 + a => 16 + 8 = 24;
由于此时表达式已经没有其他操作符执行了即在我们看来执行结束了,但其实 a 的后自增并未执行,此时编译器还会去执行 a 的三次后自增; 故此时你 printf("%d ", a); 你能得到 a = 11;
y 值计算要这样分析:(编译器逻辑有下面基本逻辑)
1. "花括号操作符" 优先级大于 "加号操作符"
2. 两个连续的 "加号操作符" 执行时先执行第一个
3. 先自增会在当前的操作执行完毕后执行 (这一点是 y 值最重要的一点)
故需要将 y 分成两大部分执行
一、 (++a) + (++a) => 第一个加号先执行,但这里有花括号(逻辑3)所以 a 先自增两次此时得到 a = 13; 最后执行相加,此时第一部分值等于 26
二、 26 + (++a) => 第二个加号执行,这里也有花括号 a 先自增一次得到 a = 14;
最后执行相加,最终 y 等于 40
上面的分析是根据 VC++6.0 编译器进行的,其他编译器不一定正确。