$i++,++$i

<?php
  $i=2;
  switch($i++){
 
  case 2: 
  echo '输出2<br/>';
  break;
 
  case 3: 
  echo '输出3<br/>'.$i;
  break;
 
  case 1:
  echo "输出1<br/>";
  break;
 
  default:
  break;
  }
  echo $i;
 ?>
//输出2<br/>3

 

$i++和++$i在发生赋值时是有区别的,但是无论哪种形式都不影响自身值得自增。
例子中执行$i++后$i的值已经变化为3了。
举个例子:
$i=1;
$y=$i++; //这里的运算顺序是$y=$i;$i=$i+1
注意,此时$y的值是1,但是$i的值是自增1次后是2了。
 
同样:
$i=1;
$y=++$i; //这里的运算顺序是 $i=$i+1;$y=$i;
结果$y=2,$i=2
这两个例子反映了他们赋值的顺序,也说明无论使用哪种形式,都不影响变量$i自增。
 

转载于:https://www.cnblogs.com/zxqblogrecord/p/9063011.html

<think> 首先,用户的问题是关于Shell脚本中的语句:i='expr $i+1'。用户问的是这个语句的含义。 我需要根据系统级指令来构建回答: - 所有行内数学表达式必须使用$...$格式。 - 独立公式用$$...$$。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题。 用户提供了几个引用: - 引用[1]:解释expr命令,提到乘号需要加反斜杠,以及MAC中的语法。 - 引用[2]:一个脚本示例,使用read和for循环。 - 引用[3]:条件语句的比较。 - 引用[4]:使用xargs和awk处理文件。 用户的问题具体是关于i='expr $i+1'的含义。这个语句看起来有误:它使用了单引号,但expr命令通常需要反引号来执行命令替换。标准的写法应该是i=`expr $i + 1` 或使用$(),如i=$(expr $i + 1)。 在Shell脚本中,expr是一个命令用于评估表达式。所以,expr $i + 1会计算i的值加1。 语句i='expr $i+1': - 这里是用单引号括起来的,所以它不会执行命令替换;而是将字符串"expr $i+1"赋值给i。这可能是用户的笔误,或者是一个错误。 正确的写法应该是: - 使用反引号:i=`expr $i + 1` - 或使用$():i=$(expr $i + 1) 在回答中,我需要解释这个。 参考提供的引用: - 引用[1]提到expr命令,用于乘法运算,以及MAC中的语法差异。 - 引用[2]有一个脚本使用let命令:let cv=2**$i,这是另一种方式做算术运算。 - 引用[3]是关于文件比较的条件语句。 - 引用[4]是文件处理,不直接相关。 所以,我可以引用[1]来支持对expr的解释。 构建回答: 1. **解释语句的含义**:指出这个语句可能错误,因为它使用了单引号,而不是命令替换。解释正确的用法。 2. **逐步解释**: - expr命令的作用。 - 命令替换的使用。 - 正确的语法。 3. **使用中文回答**。 4. **添加引用**:在相关部分末尾添加引用标识。 5. **生成相关问题**:在最后添加相关问题。 回答结构: - 先确认问题。 - 解释错误。 - 解释正确用法。 - 给出示例。 - 结束并添加相关问题。 相关问题示例: - 如何避免在Shell脚本中使用expr? - Shell脚本中其他算术运算的方法? - 为什么在MAC中expr的语法不同? 确保行内数学表达式用$...$,但这个主题没有数学表达式,所以可能不需要。如果有数值或表达式,比如在解释计算时,可以用。 例如:计算$i + 1$,其中$i$是变量。 最终回答框架: 用户的问题是:我想理解shell脚本中 'i='expr $i+1' 语句的含义 回答: 在Shell脚本中,语句 `i='expr $i+1'` 的含义是... 但实际上,这是一个常见错误。正确的方式是... 引用[1]中提到,expr命令用于评估表达式。 相关问题:... </think> 在Shell脚本中,语句 `i='expr $i+1'` 是一个常见的语法错误或误解。让我逐步解释其含义、问题所在,以及正确的实现方式。回答基于Shell脚本的标准语法(如Bash),并参考了您提供的站内引用。 ### 1. **语句的直观含义** - `i='expr $i+1'` 试图将变量 `i` 赋值为字符串 `"expr $i+1"`。 - 这里使用了单引号 `'...'` ,表示内部内容被当作字面字符串处理,不会进行命令替换或变量扩展。 - 例如: - 如果当前 `i=5`,执行此语句后,`i` 的值变为字符串 `"expr 5+1"`,而不是数值 `6`。 - 这会导致后续操作失败,因为它没有执行预期的加法运算。 引用[1]中提到,`expr` 命令用于评估算术表达式,但使用时需要正确的命令替换语法(如反引号或 `$()`),而非单引号[^1]。 ### 2. **问题分析:为什么是错误的?** - **语法错误**:在Shell中,`expr` 是一个外部命令,用于计算表达式(如 `expr $i + 1`)。但 `'expr $i+1'` 中的单引号阻止了: - 变量扩展(`$i` 不会被替换为实际值)。 - 命令执行(`expr` 不会被调用)。 - **空格问题**:`expr` 命令要求操作符(如 `+`)前后必须有空格,否则会被解析为字符串。示例中的 `$i+1` 缺少空格,即使正确使用也会报错。 - **正确对比**:参考[2]中的脚本使用了 `let` 命令处理算术运算(如 `let cv=2**$i`),这是一种更高效的内置方法[^2]。 ### 3. **正确实现方式** 如果您想将变量 `i` 增加 1,应使用命令替换或Shell内置算术运算。以下是标准方法: - **方法1: 使用 `expr` 命令替换(兼容性高)** - 语法:`i=\`expr $i + 1\`` 或 `i=$(expr $i + 1)`。 - 解释: - 反引号 `` `...` `` 或 `$(...)` 执行命令替换,将 `expr $i + 1` 的输出(即 `i+1` 的结果)赋值给 `i`。 - 注意 `+` 前后必须加空格,否则 `expr` 无法识别为运算符。 - 示例: ```bash i=5 i=$(expr $i + 1) # 正确:i 的值变为 6 echo $i # 输出 6 ``` - **方法2: 使用Shell内置算术(推荐,更高效)** - 语法:`i=$((i + 1))` 或 `((i++))`。 - 解释: - `$((...))` 是Shell内置的算术扩展,直接计算表达式,无需调用外部命令。 - 参考[1]指出,在MAC中 `$((表达式))` 语法更安全,且运算符如 `*` 不需要转义[^1]。 - 示例: ```bash i=5 i=$((i + 1)) # i 变为 6 # 或简化写法:((i++)) # 自增操作 ``` - **为什么原语句无效?** - 执行 `i='expr $i+1'` 后,变量 `i` 存储的是字符串,而非数值。如果您尝试后续计算(如 `echo $((i * 2))`),会报错,因为Shell无法将 `"expr 5+1"` 识别为数字。 ### 4. **实际脚本示例** 结合引用[2]的脚本风格,这里是一个完整的计数示例: ```bash #!/bin/bash i=0 while [ $i -lt 5 ]; do echo "当前值: $i" i=$((i + 1)) # 正确递增 i done ``` - 输出: ``` 当前值: 0 当前值: 1 当前值: 2 当前值: 3 当前值: 4 ``` ### 总结 - **含义**:`i='expr $i+1'` 错误地将字符串赋值给变量,而非执行算术运算。正确做法是使用命令替换(如 `i=$(expr $i + 1)`)或内置算术(如 `i=$((i + 1))`)。 - **最佳实践**:优先使用 `$((...))`,因为它更高效且可避免语法陷阱(参考[1]和[2])[^1][^2]。在条件语句中,类似引用[3]的文件比较逻辑也依赖正确变量处理[^3]。 如果您有更多上下文(如完整脚本),我可以进一步分析!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值