c - 使用数组时后缀/前缀如何工作
问题描述
以下是 2 个代码示例:
int k,j=1;
int x[4]={5,14,25,47};
k = x[j] + ++j;
printf("%d, %d",j,k);
显示警告 - “'j' 上的操作可能未定义”但输出为:2、16
然后我尝试了这个:
int k,j=1;
int x[4]={5,14,25,47};
k = x[j] +++j;
printf("%d, %d",j,k);
这不会给出任何警告,但输出有点令人困惑。输出 - 1,15 为什么 j 在第二种情况下没有增加?
解决方案
k = x[j] +++j;
是相同的
k = (x[j]++) +j;
此外,k = x[j] + ++j
是未定义的行为,因为未定义添加的评估顺序。除了允许编译器产生任何东西这一事实之外,这两个片段都是对该行的同样合理的解释:
j++;
k = x[j] + j;
和
j++;
k = x[j-1] + j;
一般来说,避免“聪明”。如果您不能 100% 确定自己在做什么,请不要在更复杂的语句中使用++
and 。--
在之前或之后的单独行上进行递增或递减。这将为您省去很多麻烦。例如,你能否毫无疑问地在谷歌上搜索它确切地说出什么?
while(*str++) {
/* Do something */
}
方法?恕我直言,它更清楚
while(*str) {
str++;
/* Do something */
}
当然它要花一条线,减少线的数量可能是一件好事,但在这种情况下,我认为最好还是谨慎行事。在这种特殊情况下,您还可以用括号使其更清楚:*(str++)
如果您愿意,但我想您明白我的意思。
我实际上回答了这是实际问题的答案:https ://stackoverflow.com/a/56522806/6699433
推荐阅读
- firebase - Firebase 自定义声明作为列表 + 安全规则
- r - 大量存储 rnorm 样本的所有值(向量),以便稍后进行 Tukey 测试
- linux - `do_new_mount_fc()`如何挂载像ext4这样的真实文件系统?
- python - 在我的逻辑回归程序中发现错误
- java - 了解一种方法如何计算一个数的幂
- php - 从服务器的响应中提取访问变量
- flutter - 有什么办法可以让我在一个页面中设置一个参数并在另一个页面中显示和使用它
- python-3.x - 使用 Python 在 Dropbox 上创建一个空文件夹。有没有更简单的方法?
- r - 如何在 polr 有序 logit 模型的截距上测试线性假设?
- c++ - std::reduce 与仿函数