1
0
mirror of https://github.com/php/doc-zh.git synced 2026-03-23 22:52:08 +01:00
Files
archived-doc-zh/language/operators/increment.xml
2025-11-08 17:36:58 +08:00

207 lines
4.8 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 16934048f79c6e117cd16a23c09c1b2ea502e284 Maintainer: mowangjuanzi Status: ready -->
<sect1 xml:id="language.operators.increment">
<title>递增/递减运算符</title>
<titleabbrev>递增/递减</titleabbrev>
<para>
PHP 支持前/后递增与递减运算符。这些一元运算符允许将值递增或递减 1。
</para>
<table>
<title>递增/递减运算符</title>
<tgroup cols="3">
<thead>
<row>
<entry>示例</entry>
<entry>名称</entry>
<entry>效果</entry>
</row>
</thead>
<tbody>
<row>
<entry>++$a</entry>
<entry>前加</entry>
<entry><varname>$a</varname> 的值加一,然后返回 <varname>$a</varname></entry>
</row>
<row>
<entry>$a++</entry>
<entry>后加</entry>
<entry>返回 <varname>$a</varname>,然后将 <varname>$a</varname> 的值加一。</entry>
</row>
<row>
<entry>--$a</entry>
<entry>前减</entry>
<entry><varname>$a</varname> 的值减一, 然后返回 <varname>$a</varname></entry>
</row>
<row>
<entry>$a--</entry>
<entry>后减</entry>
<entry>返回 <varname>$a</varname>,然后将 <varname>$a</varname> 的值减一。</entry>
</row>
</tbody>
</tgroup>
</table>
<para>
<example>
<title>递增/递减示例</title>
<programlisting role="php">
<![CDATA[
<?php
echo 'Post-increment:', PHP_EOL;
$a = 5;
var_dump($a++);
var_dump($a);
echo 'Pre-increment:', PHP_EOL;
$a = 5;
var_dump(++$a);
var_dump($a);
echo 'Post-decrement:', PHP_EOL;
$a = 5;
var_dump($a--);
var_dump($a);
echo 'Pre-decrement:', PHP_EOL;
$a = 5;
var_dump(--$a);
var_dump($a);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Post-increment:
int(5)
int(6)
Pre-increment:
int(6)
int(6)
Post-decrement:
int(5)
int(4)
Pre-decrement:
int(4)
int(4)
]]>
</screen>
</example>
<warning>
<para>
递增和递减运算符对 <type>bool</type> 类型值没有影响。自 PHP 8.3.0 起,会发出
<constant>E_WARNING</constant>,因为将来会默认将该值转换为 <type>int</type>
</para>
<para>
递减运算符对 <type>null</type> 类型的值没有影响。自 PHP 8.3.0 起,会发出
<constant>E_WARNING</constant>,因为将来会默认将该值转换为 <type>int</type>
</para>
<para>
递减运算符对非<link linkend="language.types.numeric-strings">数字字符串</link>没有影响。自
PHP 8.3.0 起,会发出 <constant>E_WARNING</constant>,因为在将来会抛出 <classname>TypeError</classname>
</para>
</warning>
<note>
<para>
支持重载加/减法的内部对象也可以进行递增或递减。其中一个这样的内部对象是 <classname>GMP</classname>
</para>
</note>
</para>
<sect2 xml:id="language.operators.increment.string">
<title>PERL 字符串递增功能</title>
<warning>
<simpara>
自 PHP 8.3.0 起,此功能已软弃用。应该使用 <function>str_increment</function> 函数。
</simpara>
</warning>
<para>
在 PHP 中,可以递增非<link linkend="language.types.numeric-strings">数字字符串</link>。该字符串必须是字母数字
ASCII 字符串。当到达字母 <literal>Z</literal> 且递增到下个字母时,将进位到左侧值。例如,<code>$a = 'Z';
$a++;</code><varname>$a</varname> 变为 <literal>'AA'</literal>
</para>
<example>
<title>PERL 字符串递减功能</title>
<programlisting role="php">
<![CDATA[
<?php
echo '== Alphabetic strings ==' . PHP_EOL;
$s = 'W';
for ($n=0; $n<6; $n++) {
echo ++$s . PHP_EOL;
}
// 字母数字字符串的不同行为
echo '== Alphanumeric strings ==' . PHP_EOL;
$d = 'A8';
for ($n=0; $n<6; $n++) {
echo ++$d . PHP_EOL;
}
$d = 'A08';
for ($n=0; $n<6; $n++) {
echo ++$d . PHP_EOL;
}
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
== Alphabetic strings ==
X
Y
Z
AA
AB
AC
== Alphanumeric strings ==
A9
B0
B1
B2
B3
B4
A09
A10
A11
A12
A13
A14
]]>
</screen>
</example>
<warning>
<para>
如果数字字母字符串可以解释为<link linkend="language.types.numeric-strings">数字字符串</link>,则将转换为
<type>int</type><type>float</type>。这对于看起来像以指数形式写出的浮点数字符串来说尤其是一个问题。<function>str_increment</function>
函数不会受到这些默认类型转换的影响。
</para>
<example>
<title>数字字母字符串转换为浮点数</title>
<programlisting role="php">
<![CDATA[
<?php
$s = "5d9";
var_dump(++$s);
var_dump(++$s);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
string(3) "5e0"
float(6)
]]>
</screen>
<para>
这是因为值 <literal>"5e0"</literal> 解释为 <type>float</type>,并在递增之前转换为 <literal>5.0</literal>
</para>
</example>
</warning>
</sect2>
</sect1>