C中这个语句怎样体现自增运算符的“右结合性”

Python013

C中这个语句怎样体现自增运算符的“右结合性”,第1张

op++

自增1;它是在自增之前计算op的数值的。

++op

自增1;它是在自增之后计算op的数值的。

k=2+i++

可以看作(k=2+i)++,所以k=5

C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。例如算术运算符的结合性是自左至右,即先左后右。如有表达式x-y+z则y应先与“-”号结合, 执行x-y运算,然后再执行+z的运算。这种自左至右的结合方向就称为“左结合性”。而自右至左的结合方向称为“右结合性”。 最典型的右结合性运算符是赋值运算符。如x=y=z,由于“=”的右结合性,应先执行y=z再执行x=(y=z)运算。 C语言运算符中有不少为右结合性,应注意区别,以避免理解错误。

自增1运算符记为“++”,其功能是使变量的值自增1。自减1运算符记为“--”,其功能是使变量值自减1。自增1,自减1运算符均为单目运算,都具有右结合性。可有以下几种形式: ++i i自增1后再参与其它运算。--i i自减1后再参与其它运算。

i++ i参与运算后,i的值再自增1。

i-- i参与运算后,i的值再自减1。

在理解和使用上容易出错的是i++和i--。 特别是当它们出在较复杂的表达式或语句中时,常常难于弄清,因此应仔细分析。

首先我们来看下面的代码

上面这部分代码输出的结果是什么呢?

行指针:指的是一整行数据,不指向具体的元素.

列指针:指的是一行中某个具体元素.

我们可以理解成为行指针的具体元素,行指针理解为列指针的地址 他们可以相互的变化

*行指针 列指针

&列指针 行指针

讲解下上面的代码

a是这个“特殊的”一维数组的名称,也就是首地址,也就是第一个元素的地址,也就是第一行的首地址,是指首行一整行,并不是指某个具体元素。那么我们称之为“行指针”,

既然我们知道了a是行指针那么在我们所学习中的一个指针加1就是偏移一个单位,而a的单位是一行,所以p=a+1 即p指向了第二行,即p=a[1].

b = *p+1,p是存放的第二行的首地址,那么*p即拿到了第二行的首个元素的地址,那么 *p+1就是便宜一个int,因为此时*p就是一个int指针.所以b=*p+1 即 b=&a[1][1]

c = *a + 1根据上面所说的c=&a[0][1].

printf("a=%d ", **(a))这个就没啥好说了 **(a) 等同于 a[0][0].

根据上诉所说 输出结果

所以列指针指向的是某一行的具体元素,上面例子中的b和c

行指针指向的是指向一整行数据,不是指向具体的某个具体的数据.上面例子的a和p

行指针和列指针多应用于矩阵,在实际普通开发中比较少运营到,但是可以帮助对指针更深入地了解.

以上是8年开发经验对行指针和列指针的个人理解,欢迎大家讨论交流.

我会不断地分享我自己认为在C语言中比较难理解的知识点,欢迎大家关注点赞转发.

两种方案,直接用数学方法计算和转为为字符串。

第一:数学方法,对于任意一个数n,要计算第site位的数,都可以用

n/10^(site-1)%10

计算出来。比如计算123各位数:

int data=123

printf("%d\n",data/100%10)

printf("%d\n",data/10%10)

printf("%d\n",data/1%10)

结果是:

第二:转化为字符串,这里要用到一个函数itoa。同样是计算123各个位数。

代码:

int data = 123

char array[100]

itoa(data, array, 10)    //转化为字符串

printf("%c\n", array[0])

printf("%c\n", array[1])

printf("%c\n", array[2])

结果和上面一样!

两种方式都能计算出,但是第一种方式计算未知位数的数时很麻烦,要首先计算出数的位数,相比较第二种就没那问题,只要定义足够大的数组就不存在这个问题。