精华内容
下载资源
问答
  • C语言自增自减运算 恶心问题

    千次阅读 2019-04-08 16:49:51
    c语言中,自增(++)和自减(–-)运算是很有c语言特色(恶心)一种运算符。 可以按教科书那种记: b = a++ 是先赋值后运算,即先 b=a,然后 a++。 b = ++a 是先运算后赋值,即先 ++a,然后 ++a。 例子: 好好...

    c语言中,自增(++)和自减(–-)运算是很有c语言特色(恶心)的一种运算符。

    可以按教科书那种记:
    b = a++ 是先赋值后运算,即先 b=a,然后 a++。
    b = ++a 是先运算后赋值,即先 ++a,然后 ++a。

    例子:
    在这里插入图片描述

    好好想一下即可。

    注意结合性,从右边到左边。

    自增:后缀:同表达式中Turbo C的情况相同:先统一取值后依次自增,如:

    int a,i=5; a=i+++i+++i++;a=15, i=8.

    1、 在一般表达式中和在函数参数中计算的结果相同(这一点与TurboC环境不同);

    2、 后缀:同表达式中Turbo C的情况相同:先统一取值后依次自增,如:

    int a,i=5; a=i+++i+++i++;a=15, i=8.

    3、 前缀:前两个自增同Turbo C,即依次自增后统一取值,后面的每个自增后即

    取值,如:

    int a, i=5; a= ++i+(++i)+(++i); a=22, i=8.

    4、 前后缀混合的情况:

    (1) 一般情况:表达式中自左向右计算,参数自右向左运算。前缀自增后取值;后缀(或变量)取值依其所处位置而定,有连续多个将统一取值,其自增在语句结束前进行。

    (2) 前后缀各有一个的情况:设int i=5; 由于i++++i应满足交换率与++ii++相同,规定按后者计算故为36。实验2内容4:int i=5;printf("%d,%d\n", --i, i++*++i ); 打印5,36。

    (3) 若i++或++i或两者有多于一个的情况:++i有两个以上在一起时最左边的连续自增同3、,其余每个自增后取值,如:int i=5;

    printf("%d\n%d\n",–i,(++i)+(i++)+(i++)+(++i));打印6和25

    解释:i++的语句的加是在;后才加的
    不妨再在下面打行(i)的输出代码,i是8!!!!
    后缀(或变量)取值依其所处位置而定,有连续多个将统一取值,其自增在语句结束前进行。

    printf("%d\n%d\n",–i,(++i)+(++i)+(++i)+(++i)+(i++));打印8和40

    printf("%d\n%d\n",–i,(++i)+(++i)+(++i)+i+(++i)+(++i)); 打印9和49

    (4) 函数参数中有括号时,括号参数优先计算,其余参数仍自右向左计算,如:

    int i=9,j=8;printf("%d %d\n", (++i, j–), ++i); 打印8 11

    printf("%d %d%d\n", (++i, j–), ++i, i); 打印8 11 10

    (5) 最后i的值等于原值加总自增次数减自减的次数.

    展开全文
  • C语言自增自减运算符详解

    千次阅读 2011-07-26 11:18:54
    自增1,自减1运算符均为单目运算,都具有右结合性。可有以下几种形式: ++i i自增1后再参与其它运算。 --i i自减1后再参与其它运算。 i++ i参与运算后,i值再自增1。 i-- i参与运算后,i值再自减1。 在理.....
    自增1,自减1运算符:自增 1 运算符记为“++”,其功能是使变量的值自增 1。
    自减1,自减1运算符:自增 1运算符记为“--”,其功能是使变量的值自增1.
    自增1,自减1运算符均为单目运算,都具有右结合性。可有以下几种形式:
    ++i i自增1后再参与其它运算。
    --i i自减1后再参与其它运算。
    i++ i参与运算后,i的值再自增1。
    i-- i参与运算后,i的值再自减1。
    在理解和使用上容易出错的是 i++和 i--。 特别是当它们出在较复杂的表达式或语句中
    时,常常难于弄清,因此应仔细分析。
    展开全文
  • 结合性:从右到左 ++i:先加()1,再放到表达式里运算 i++:先用本身值算一次,表达式算完了,i再加()1 例子: 碰到先加 值就是本身,等所在表达式做完出来以后,再给自己加一个。 注意: ++,–运算符只能...

    运算符等级:2

    结合性:从右到左

    ++i:先加(减)1,再放到表达式里运算
    i++:先用本身的值算一次,表达式算完了,i再加(减)1

    例子:
    棵
    碰到先加

    棵
    值就是本身,等所在的表达式做完出来以后,再给自己加一个。

    注意:
    ++,–运算符只能用于变量,而不能用于常量和表达式。(单目运算符)

    a++,b-- 对
    5++,(x+y)-- 错
    5++==5=5+1 错

    c
    c语言规定:当多个运算符凑在一起,但是又没有括号,计算机会尽可能多地从左向右将若干个字符组成一个运算符。

    图片来自慕课c语言零基础

    展开全文
  • C语言的自增自减运算符详解,printf等函数应用,及其源码等前言作用基础介绍一些应用中坑连加时加号左结合性条件运算符中短路规则负号结合性printf出栈入栈与压参打印方向源码(解释一下左值...

    前言

    本人大一新生,接触C语言才几周,所以有错的地方,还请大佬们评论区给我说一下或者私聊均可。这篇博客是我被要求做自增自减PPT的产物,原本以为很简单,逛完论坛才发现坑好多。有些不适合课上说的,都放到这了。

    作用

    这是最简单的了,可分为前置与后置。
    前置:

    #include<stdio.h>
    int main()
    {
    	int i(1);
    	++i;
    	printf("%d",i);
    	return 0;
    }
    

    #include<stdio.h>
    int main()
    {
    	int i(1);
    	--i;
    	printf(“%d”,i);
    	return 0;
    }
    

    后置:

    #include<stdio.h>
    int main()
    {
    	int i(1);
    	i++;
    	printf(“%d”,i);
    	return 0;
    }
    

    #include<stdio.h>
    int main()
    {
    	int i(1);
    	i--;
    	printf(“%d”,i);
    	return 0;
    }
    

    答案就不必说了,懂的都懂,前置与后置的区别是:前置先将变量自身加一,然后再带入计算表达式;后置是先带入计算表达式,然后再将变量的值加一。

    接下来以i++与++i为介绍对象,减号与之同理。

    基础的介绍

    1.它是单目运算符,且具有右结合性,所以只针对单个变量,无法针对表达式或常量。对于k=++i++(即k=++(i++));或6++这种类型的是错误的。

    2.++i可以作为左值,但是i++不行(这个后面说源码时会介绍我自己理解的原因)

    3.读取规则按照贪心法,即一个字符下尽可能多的结合其他字符。这里为了程序的可读性与后期维护,还是用括号分开吧,空格也可以起到同样的作用。
    比如:对于

    #include<stdio.h>
    int main()
    {
    	int a,i(1);
    	a=++i + ++i + ++i;
    	printf(“%d”,a);
    	return 0;
    }
    

    输出结果是a=10;i=4;(为什么a=10,后面会解释)
    如果不加空格或括号的话,这个表达式会被系统依据贪心法认为是++(i++)+(i++)+i;就直接报错了。

    一些应用中的坑

    连加时的加号左结合性

    对于刚才提到的a=++i + ++i + ++i,这两个加号的优先级一样,所以取决于其结合性。
    所以系统之前读出来的不是a=(++i)+(++i)+(++i),而是a=((++i)+(++i))+(++i)。
    翻译过来是这样

    #include<stdio.h>
    int main()
    {
    	int i(1),a;
    	i=i+1;
    	i=i+1;
    	a=i+i;
    	i=i+1;
    	a=a+i;
    	printf(“%d”,a);
    	return 0;
    }
    

    所以a=(3+3)+4=10;

    条件运算符中的短路规则

    这个主要是if的条件中如果用了&&或||,且后面的条件包括自增自减,可能会被短路掉,不作处理。
    例如:

    #include<stdio.h>
    int main()
    {
    	int i(1);
    	if(1!=0||i++)
    	printf(“%d”,i);
    	return 0;
    }
    

    #include<stdio.h>
    int main()
    {
    	int i(1);
    	if(1==0&&i++)
    	printf(“%d”,i);
    	return 0;
    }
    

    由于都被短路掉了,所以输出的i值都是1。

    负号的右结合性

    由于优先级相同所以取决于“-”的右结合性,遵循从右到左的执行顺序。
    这个比较简单所以不举例了。

    printf的出栈入栈与压参打印方向

    printf函数是先从后往前遍历所有元素并计算出每个元素对应的变量的值,然后将相应的临时变量或实参入栈,最后出栈打印。所以printf的最终打印是最后一步。i与前置最后入栈的都是i的实参,所以打印的是i的终值。而后置都是读取的相应的临时变量。
    例如

    #include<stdio.h>
    int main()
    {
    	int i(1);
    	printf(“%d %d %d %d”,i++,++i,++i,i++);
    	return 0;
    }
    

    对应的是4,5,5,1;
    翻译一下是:
    取i的值为一临时变量(q);
    i=i+1;
    返回i值为2;
    i=i+1;
    返回i值为3;
    以实参i为其返回值;
    i=i+1;
    返回i值为4;
    以实参i为其返回值;
    取i的值为一临时变量(w);
    i=i+1;
    返回i值为5;
    将“临时变量q,实参i,实参i,临时变量w”依次压入栈中,最后出栈打印。

    源码(解释一下左值的问题)

    int& int::operator++() 
    {
    *this += 1;
    return *this;
    }
    const int int::operator++(int)
    {
    int oldValue = *this;
    ++(*this);
    return oldValue;
    }
    

    (来自“C语言中自增自减的编译原理”)
    很明显的看到i++返回的是临时变量自然没有固定的内存地址,就做不了左值,而++i;改变的是其自身的实参所以可以用来作为左值。

    展开全文
  • 定义变量a、b、c和i,初始化a和i,接着赋值b、c,输出a、b、c,最后输出i各种自增自减结果 代码 #include #include "conio.h" int main() { int a = 5, b, c; int i = 10; b = a++; c = ++b;
  • C语言运算符优先级与结合性 优先级 运算符 功 能 适用范围 结合性 15 [ ] . -> 整体表达式参数表 下标 存取成员 通过指针存取成员 表达式 参数表 数组 结构/联合 结构/联合 14 ~ ++ -- - & * (type) sizeof) ...
  • 1.掌握C语言算术、赋值、自增自减运算符及相应表达式 2.掌握不同类型数据之间赋值规律 3.了解强制数据类型转换以及运算符优先级、结合性 4.学会根据表达式,编写相应程序,验证表达式结果方法
  • 本项目有两个任务,任务一会介绍算术、自增自减、赋值、逗号运算符以及相关表达式,任务二我们还会学到比较运算符以及逻辑运算符,学好这两个运算符为我们以后学习选择结构和循环结构打下了基础,在任务二中我们还会...
  • C 语言运算符优先级与... -> 通过指针存取成员 结构 /联合 结构 /联合 14 逻辑非 逻辑运算 ~ 按位求反 位运算 ++ 加 1 自增 -- 减 1 自减 - 取负 算术运算 & 取地址 指针 * 取内容 指针 (type) 强制类型 类型转换
  • 参考资料: 说说C语言运算符“优先级”与...(2)后自增(后自减)从语义效果上可以理解为在做完自增自减)之后,返回自增自减)之前值作为整个表达式结果值; (3)准确来讲,优先级和结合性确定了表达
  • C语言运算符

    2019-04-14 16:26:54
    三、自增自减 四、关系运算符 五、逻辑运算符 六、位运算 一、运算符优先级 所谓优先级,就是当多个运算符出现在同一个表达式中时,先执行哪个运算符。C语言中大部分运算符优先级和数学中是一样。如果搞...
  • C语言自增自减运算符 1、++i,–i 在使用i之前,先是i值加(减)1 2、i++,i– 在使用i之后,使i值加(减)1 注意:自增和自减运算符只能用于变量,而不能用于常量或表达式 C语言算术表达式和运算符优先级与...
  • C语言运算符

    2018-04-12 16:34:46
    C语言提供了丰富运算符来实现数据运算,常用运算符有算术运算符、赋值运算符、自增自减运算符、逗号运算符、三目运算符、关系运算符和位运算符。 各个运算符都有优先级和结合性,所谓优先级指就是在...
  • c语言的运算符

    2015-02-24 15:58:12
    c语言运算符有着不同优先级,而且还有结合性,大大增加了c语言的复杂度,包括以下9种 1、算数运算符  用于包括加(+)、减(-)、乘(*)、除(/)、求余(%)、自增(++)、自减(--)七种数值运算。 2、关系...
  • 1. 算术运算: 双目运算:(参与运算有两个)加减乘除取余,除法... 单目运算:(参与运算只有一个)自增自减取负,a++或++a等效于a=a+1;a--或—a等效于a=a-1,前置(先操作在取变量值) ++在前 和后置(先取...
  • C语言运算符(一)

    千次阅读 2020-06-30 17:29:46
    C语言运算符(一)一、算数运算符1、了解算数运算符2、示例演示二、自增自减运算符1、了解自增自减运算符2、示例演示三、强制类型转换运算符1、了解强制类型转换运算符2、示例演示四、bug解析五、总结 一、算数...
  • 自增自减运算符 关系运算符与表达式 优先级与结合性 逻辑运算符与表达式 位逻辑运算符与表达式 位逻辑运算符 位逻辑表达式 逗号运算符与表达式 复合赋值运算符 每文一语 表达式 函 数 概 述 表达式是...
  • C语言--运算符

    2020-02-01 16:41:17
    文章目录C语言 运算符一、概念1.1运算符1.2操作数1.3表达式1.3优先级1.4结合性二、运算符分类2.1赋值运算符2.2算数运算符2.3关系运算符2.4按位运算符2.5逻辑运算符2.6自增自减运算符2.7三目运算符2.8复合赋值...
  • C语言视频教程

    2020-06-16 08:54:47
    基本概念 基本概念概述 编写第一个C程序 变量 标示符 关键字 数据类型 ... 自增自减运算 优先级和结合性 关系运算 逻辑运算 流程控制 流程控制概述 if 语句 switch语句 while循环语句 ...
  • 包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(--)共七种。 2.关系运算符:用于比较运算。包括大于(>)、小于(<)、等于(==)、大于等于(>=)、小于等于(<=)和不等于(!=)六种。 3....
  • 关于C语言运算符优先级和结合性时常有疑惑,特此...、指向结构体指针取成员->、后缀自增++、后缀自减--。如果一个操作数后面有多个后缀,按照离操作数从近到远顺序(也就是从左到右)依次运算,比如a.name++,先
  • Version 1.0 * * * 掌握基本算术运算规则 掌握算术运算中自增与自减运算 掌握复合赋值运算 * 1基本算术运算符 2自增自减运算符 3算术表达式 * 加法运算符+加法运算符为二元运算符如a+b4+8等具有从左到右结合性 ...
  • C语言的科学和艺术.pdf

    热门讨论 2012-01-19 14:09:05
    3.1.2 自增自减运算符 47 3.2 解决规模稍大问题 47 3.3 控制语句 48 3.3.1 重复n次习语 49 3.3.2 迭代和循环 50 3.3.3 下标变量 50 3.3.4 初始化重要 51 3.3.5 读入-直到-标志习语 53 3.3.6 创造一...
  • 算术运算符和算术表达式 ...自增自减运算符 + +i:i先自增1后再参与其他运算; (i=5,y=++i;则是6=i+1) - -i:i先自减1后再参与其他运算; i+ +:i参与运算后,i值再自增1;(i=5,y=i++;则是5=i.
  • 运算符优先级和结合性;算术运算符;自增自减运算符;算术运算符特殊问题;自增自减运算;关系运算;关系运算符;关系表达式;关系表达式;关系表达式使用;关系运算不足;逻辑运算;逻辑表达式;逻辑运算;逻辑表达式...
  • 自增 自减运算符 作用是使变量值加1或减1 如 ++i ,- -i (在使用i之前,先使i值加(减)1) i++, i- -(在使用i之后,使i值加(减)1) 3.算术表达式和运算符优先级与结合性 用算术运算符和括号将运算对象(也...
  • c语言基础 (3)

    2013-04-26 18:07:09
    1.自增1,自减1运算符:自增1运算符记为...自增1,自减1运算符均为单目运算,都具有右结合性。可有以下几种形式: ++i i自增1后再参与其它运算。 --i i自减1后再参与其它运算。 i++ i参与运算后,i值再自增...
  • C语言运算符学习笔记

    2015-05-12 23:44:00
    运算符不仅具有不同的优先级,还有不同的结合性。在表达式中,各运算量参与运算的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的制约,以便确定是左向右进行运算还是右向左进行运算。 C语言的...

空空如也

空空如也

1 2 3
收藏数 60
精华内容 24
关键字:

c语言自增自减的结合性结合性

c语言 订阅