条件运算符和数组/返回指向数组的指针
condition operator and arrays / returning an pointer to array
我希望有人能解释return (i % 2) ? &odd : &even;
的条件陈述如何能够确定i
是偶数还是奇数。
我很困惑,因为&odd
和&even
都是对int odd[]
和int even[]
的引用。据我了解,条件语句不会"迭代"数组并检查数组中的所有值以检查匹配项的(i % 2)
条件。下面是代码。我希望我足够清楚。
#include <iostream>
int odd[] = { 1, 3, 5, 7, 9 };
int even[] = { 0, 2, 4, 6, 8 };
decltype(odd)* arrptr(int i) { // equivalent to int (*arrPtr(int))[5] or
// auto arrPtr(int i) -> int(*)[5]
return (i % 2) ? &odd : &even;
}
int main()
{
arrptr(3);
system("pause");
return 0;
}
这是为了解释您在您发布到另一个答案的评论中看到的困惑。
条件语句如何知道偶数或奇数之间的区别?
其实不然。它只是计算第一个表达式并检查真值。就像if
一样,你插入决定i
是偶数还是奇数的逻辑。通常这是通过中间提醒运算符i % 2
完成的。
条件语句中的表达式只不过是对名为 &odd[] 和 &even[] 的数组的引用。程序中没有任何内容可以告诉程序偶数或奇数的含义。
不,第二个和第三个参数是&odd[]
和&even[]
。你错过了第一个;它是一个条件表达式,将针对真值进行评估。
如果i
是偶数,i % 2
将返回0
,否则1
如果i
是奇数。此整数值将隐式转换为布尔值,因为表达式是在布尔上下文中计算的。在 C 和 C++ 中,任何非零值都是真,否则为假。因此,如果i
是偶数,它将返回 false,否则为 true。
我认为让你感到困惑的是操作数 2 和 3 的名称;在心理上将它们重命名为 evenArray
和 oddArray
。运算符所做的是,它返回一个数组。哪个阵列?它基于第一个操作数做出决定,而第一个操作数又以参数i
的奇偶(偶数/奇数)决定它。
这是 C 条件运算符?:
。问号前面的部分是布尔表达式。如果它的计算结果为 true,则执行问号和冒号之间的部分,否则执行另一部分。它相当于:
if(boolean expr) { expression1 }
else { expression2 }
在您的示例中,您可以编写:
decltype(odd)* arrptr(int i)
{ if(i % 2) return &odd;
else return &even;
}
您可能会对数组的命名方式感到困惑。该函数根据 i
的值返回指向数组的指针(该函数对数组中存储的数字一无所知)。也就是说,如果i
是奇数,我们返回指向名为 odd
的数组的指针,如果它是i
,则返回指向名为 even
的数组的指针。i % 2
部分告诉您i
是偶数还是奇数。希望这有帮助。
- 添加到数组指针
- C++语法差异:二维和一维数组(指针算术)
- 数组指针表示法C++(移动数组时)
- 复制后删除原始数组指针将前 3 个字节设置为 0
- C++访问指向结构的指针中的类数组指针
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- std::flush可以用于将对象指针转换为其封闭数组指针吗
- 创建<int>对整数数组指针的矢量引用 (C++)
- 将 2D 数组指针传递给 C++ 中的函数
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 队列数组指针 (C++)
- C++数组指针上的删除操作
- 对于循环不循环和检测字符数组 [指针和字符数组]
- 如何初始化数组指针对象
- 如何正确传递 2D 数组指针作为参数
- 从数组指针中获取怪异的数字
- 初始化std :: unique_ptr作为原始数组指针的初始化
- 将结构数组指针从C#传递到C
- STD :: Sort将数组指针设置为NULL
- C++数组指针错误无法将“int*”转换为“int**”