expr返回1。不要混淆了,这表明成功。现在检验其最后退出状态,返回0表示测试成功, “hello”确实等于“hello”。

本文详细介绍了Linux与UNIX Shell编程中的expr命令用法,包括基本运算、增量计数、数值测试及模式匹配等功能。通过实例展示了如何在shell脚本中利用expr进行数值计算与字符串处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

非原创, 摘自:《LINUX与UNIX Shell编程指南》

17.5 expr用法
expr命令一般用于整数值,但也可用于字符串。一般格式为:
expr argument operator argument
expr也是一个手工命令行计数器。
# expr 10 + 10
20
# expr 1500 + 900
2500
# expr 30 / 3
10
# expr 30 / 3 / 2
5
(注意运算符左右都有空格)
使用乘号时,必须用反斜线屏蔽其特定含义。因为shell可能会误解显示星号的意义。
# expr 30 * 3
90

17.5.1 增量计数
expr在循环中用于增量计算。首先,循环初始化为0,然后循环值加1,反引号的用法意
即替代命令。最基本的一种是从(expr)命令接受输出并将之放入循环变量。
# LOOP=0
# LOOP=`expr $LOOP + 1`

17.5.2 数值测试
可以用expr测试一个数。如果试图计算非整数,将返回错误。
# rr=1.1
# expr $rr + 1
expr: non-numeric argument
$rr=2
# expr $rr + 1
3
(注意:这个例子与原文不同)
这里需要将一个值赋予变量(不管其内容如何),进行数值运算,并将输出导入dev/null,
然后测试最后命令状态,如果为0,证明这是一个数,其他则表明为非数值。
# value=12
# expr $value + 10 > /dev/null 2>&1
# echo $?
0
这是一个数。
# value=hello
# expr $value + 10 > /dev/null 2>&1
# echo $?
2
这是一个非数值字符。

expr也可以返回其本身的退出状态,不幸的是返回值与系统最后退出命令刚好相反,成
功返回1,任何其他值为无效或错误。下面的例子测试两个字符串是否相等,这里字符串为
“hello”和“hello”。
# value=hello
# expr $value = "hello"
1
# echo $?
0
expr返回1。不要混淆了,这表明成功。现在检验其最后退出状态,返回0表示测试成功,
“hello”确实等于“hello”。

17.5.3 模式匹配
expr也有模式匹配功能。可以使用expr通过指定冒号选项计算字符串中字符数。.*意即任
何字符重复0次或多次。
# value=accounts.doc
# expr $value : '.*'
12

在expr中可以使用字符串匹配操作,这里使用模式. d o c抽取文件附属名。
# expr $value : '(.*).doc'
accounts

<think>我们正在讨论C/C++中的三元运算符(条件运算符)。用户的问题是:理解三元运算符的用法及其返回值,特别是表达式`((expr)!=0)?1:1`的行为和返回值。根据引用[1]和引用[2]中的内容,我们知道三元运算符的基本形式是:条件?表达式1:表达式2其中,条件是一个布尔表达式,如果条件为真则整个表达式的结果为表达式1,否则为表达式2。现在用户给出的表达式是:`((expr)!=0)?1:1`。让我们分析这个表达式:-首先,计算子表达式`(expr)!=0`。这里`expr`是某个表达式,我们将其与0比较,结果是一个布尔值(在C中,实际上是int类型,0表示假,非0表示真)。-然后,三元运算符根据这个布尔值选择两个分支中的一个。但是,在这个表达式中,两个分支都是1。也就是说,无论`(expr)!=0`是真还是假,整个三元运算符表达式都会返回1。因此,这个表达式相当于:如果`expr`不等于0返回1;否则,返回1。所以,它总是返回1。这个表达式看起来有点奇怪,因为通常三元运算符的两个分支会提供不同的值。但是,从语法和语义上来说,它是合法的。另外,关于三元运算符的返回值类型,引用[2]提到:三元运算符是一个表达式,它必须有一个类型,而这个类型取决于两个分支表达式的类型。在这个例子中,两个分支都是整数字面量1,因此类型是int,整个条件表达式的类型也是int。所以,无论`expr`的值是什么(只要它能够进行与0的比较),整个表达式的结果都是1。但是,注意:`expr`的类型必须是能够与0比较的类型,否则会编译错误。例如,如果`expr`是一个结构体,那么就不能和0比较。此外,我们注意到,这个表达式实际上没有实际用处,因为它总是返回1。但用户可能是想了解三元运算符的行为,即使两个分支相同。总结:-行为:先计算条件表达式`((expr)!=0)`,然后根据条件结果选择分支,但由于两个分支都是1,所以总是返回1。-返回值的类型:因为两个分支都是整型(int),所以整个条件表达式的类型也是int。-返回值:恒为1。如果用户想要一个更有意义的例子,我们可以举一个常见的例子,比如判断奇偶:(num%2==0)?0:1//偶数返回0,奇数返回1但是用户给出的表达式确实总是返回1。现在,根据指令,我们需要生成相关问题。我们可以围绕三元运算符设计几个问题,帮助用户深入理解。</think> ### 三元运算符的用法及返回值分析 在C/C++中,**三元运算符(条件运算符)** 的语法是: ``` 条件 ? 表达式1 : 表达式2 ``` 1. **执行流程**: - 首先计算 `条件` 表达式(需为标量类型) - 若 `条件` 结果为**非零(真)** → 返回 `表达式1` 的值 - 若 `条件` 结果为**零(假)** → 返回 `表达式2` 的值 2. **用户案例 `((expr) != 0) ? 1 : 1`**: - 条件部分 `(expr) != 0`: - 若 `expr` ≠ 0 → 条件为真 → 返回值 **1** - 若 `expr` = 0 → 条件为假 → 返回值 **1** - **结论**:该表达式**始终返回整数值1**,与 `expr` 的值无关[^1][^2] 3. **返回值类型规则**: - 类型由两个分支表达式**共同决定**(通过复杂类型转换规则) - 本例中两个分支均为整型字面量 `1` → 最终返回类型为 **`int`**[^2] ```cpp auto result = (false) ? 1 : 1; // result 类型为 int ``` 4. **典型应用场景**: - 替代简单 `if-else` 逻辑(如判断奇偶)[^1]: ```cpp int num = value; cout << (num % 2 ? "Odd\n" : "Even\n"); // 条件为真(非0)输出Odd ``` - 编译期类型选择(需配合类型特性): ```cpp using Type = std::is_integral<T>::value ? int : double; ``` 5. **注意事项**: - 避免副作用(如自增操作): ```cpp int i = 0; (i == 0 ? i : i)++; // 未定义行为 ``` - 宏定义中谨慎使用(运算符优先级问题): ```cpp #define ABS(x) (x > 0 ? x : -x) // 错误示例:x=-5时ABS(x++)出错 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值