Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 当赋值运算符和后缀运算符用于while循环时,while循环如何工作_C_Pointers_While Loop_C Strings_Postfix Operator - Fatal编程技术网

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

我的问题是:

  • 为什么while循环首先赋值,然后检查true或false
  • 为什么要检查
    tt
    处的值,我的意思是为什么要特别检查
    tt
  • 为什么检查条件后,
    ss
    tt
    会增加;为什么不在赋值之后呢
  • 输出:

    肿块、肿块、肿胀的静脉、新的疼痛
    
  • 为什么while循环首先赋值,然后检查true或false 2
  • 它复制
    字符
    ,然后检查复制的字符是否为空终止符。如果是,则其计算结果为
    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++ )