C 当赋值运算符和后缀运算符用于while循环时,while循环如何工作
我在一本关于指针的书中找到了这段代码,这本书解释了以下代码。首先,存储在C 当赋值运算符和后缀运算符用于while循环时,while循环如何工作,c,pointers,while-loop,c-strings,postfix-operator,C,Pointers,While Loop,C Strings,Postfix Operator,我在一本关于指针的书中找到了这段代码,这本书解释了以下代码。首先,存储在ss中的地址处的值替换存储在tt中的地址处的值。分配后,执行测试以确定while循环是否应继续。因为*tt给出了'l',这是真实值。 接下来,递增ss和tt 我的问题是: 为什么while循环首先赋值,然后检查true或false 为什么要检查tt处的值,我的意思是为什么要特别检查tt 为什么检查条件后,ss和tt会增加;为什么不在赋值之后呢 输出: 肿块、肿块、肿胀的静脉、新的疼痛 为什么while循环首先赋值,然后检查
ss
中的地址处的值替换存储在tt
中的地址处的值。分配后,执行测试以确定while
循环是否应继续。因为*tt
给出了'l'
,这是真实值。
接下来,递增ss
和tt
我的问题是:
tt
处的值,我的意思是为什么要特别检查tt
ss
和tt
会增加;为什么不在赋值之后呢肿块、肿块、肿胀的静脉、新的疼痛
字符
,然后检查复制的字符是否为空终止符。如果是,则其计算结果为0
(或false
),循环停止
为什么tt的值被检查,我的意思是为什么特别是tt
实际上,这是检查的=
的结果,它等于分配的值。因此,如果*ss
是'\0'
,则=
返回'\0'
,循环停止,因为'\0'
等于0
或false
为什么ss和tt在检查条件后会增加?为什么不
赋值后
这是postifix增量,因此赋值(
=
)是用旧值完成的,而不是增量值。这样的表达式
*ss++
可以等效地重写为
*( ss++ )
也就是说,后缀增量运算符++
的优先级高于一元运算符*
根据C标准(6.5.2.4后缀递增和递减运算符,第2页)
2后缀++运算符的结果是操作数的值。
作为一种副作用,操作数对象的值会增加(即
是,将适当类型的值1添加到其中)。。。价值
结果的计算顺序在副作用之前
正在更新操作数的存储值
因此,例如,如果指针ss
指向字符串s
的第一个字符,那么表达式ss++
的值就是这个地址,并且只有在返回地址后,指针才会递增
然后,作为表达式ss++
的值的返回指针被取消引用,表达式*(ss++)
的值是存储在数组s
中的字符串的第一个字符
类似地,表达式*(tt++)
的值是指针tt
在递增之前指向的对象
因此,数组t
的第一个字符被分配给数组s
的第一个字符
进一步根据C标准(6.5.16赋值运算符,第3页)
3赋值运算符将值存储在由指定的对象中
左操作数。赋值表达式的值为左
赋值后的操作数,111),但不是左值
因此,在循环的第一步中,赋值运算符的值是字符'l'
最后(6.8.5迭代语句,第4页)
4迭代语句导致调用循环体语句
重复执行,直到控制表达式与
0
由于赋值表达式(字符'l'
)的结果不等于0,则循环继续。它将一直执行,直到表达式*(ss++)
返回使用赋值表达式*tt++=*ss++
分配给数组t
的数组s
的终止零字符'\0'
在这种情况下,赋值表达式的结果是字符'\0'
(升级为int
类型的0
),然后循环停止其迭代
<数组>代码> t>代码>包含数组中存储的代码<>代码> s/C++ >。c和C++不相同。选择一个标签。@康拉德鲁道夫问题被标记为C++第一。在C中我同意,而在C++中,我从来没有遇到过这种模式。
*( ss++ )