条件运算符和数组/返回指向数组的指针
condition operator and arrays / returning an pointer to array
我希望有人可以解释 return (i % 2) ? &odd : &even;
的条件语句如何能够确定 i
是偶数还是奇数。
我很困惑,因为 &odd
和 &even
是对 int odd[]
和 int even[]
的引用。据我了解,条件语句不会 "iterate" 通过数组并检查数组中的所有值以检查 (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;
}
即C条件运算符?:
。问号前的部分是一个布尔表达式。如果计算结果为真,则执行问号和冒号之间的部分,否则执行另一部分。相当于:
if(boolean expr) { expression1 }
else { expression2 }
在你的例子中,你可以这样写:
decltype(odd)* arrptr(int i)
{ if(i % 2) return &odd;
else return &even;
}
您可能对数组的命名方式感到困惑。函数 return 是一个指向数组的指针,具体取决于 i
的值(该函数对存储在数组中的数字一无所知)。也就是说,如果 i
是奇数,我们 return 指向名为 odd
的数组的指针,如果它 i
是偶数,我们 return 指向数组的指针名为 even
的数组。 i % 2
部分告诉您 i
是偶数还是奇数。希望这有帮助。
这是为了解释我在您发布到其他答案的评论中看到的困惑。
How does the conditional statement know the difference between what is a even number or an odd number?
没有。它只是计算第一个表达式并检查真值。与 if
一样,您插入决定 i
是偶数还是奇数的逻辑。通常这是通过整数提醒运算符 i % 2
.
完成的
The expressions in the conditional statement are nothing more than references to an array named &odd[] and &even[]. There is nothing in the program that tells the program what even or odd number means.
不是,第二个和第三个参数就是&odd[]
和&even[]
。你错过了第一个;它是一个条件表达式,将计算真值。
i % 2
将 return 0
如果 i
是偶数,否则 1
如果 i
是奇数。该整数值将隐式转换为布尔值,因为表达式是在布尔上下文中计算的。在 C 和 C++ 中,任何非零值都是 true else false。因此,如果 i
是偶数,它将 return false,否则 true.
我认为让您感到困惑的是操作数 2 和 3 的名称;在心里将它们重命名为 evenArray
和 oddArray
。运算符所做的是,它 returns 是一个数组。哪个数组?它根据第一个操作数决定,而第一个操作数又决定它与参数 i
.
的奇偶校验 (even/odd)
我希望有人可以解释 return (i % 2) ? &odd : &even;
的条件语句如何能够确定 i
是偶数还是奇数。
我很困惑,因为 &odd
和 &even
是对 int odd[]
和 int even[]
的引用。据我了解,条件语句不会 "iterate" 通过数组并检查数组中的所有值以检查 (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;
}
即C条件运算符?:
。问号前的部分是一个布尔表达式。如果计算结果为真,则执行问号和冒号之间的部分,否则执行另一部分。相当于:
if(boolean expr) { expression1 }
else { expression2 }
在你的例子中,你可以这样写:
decltype(odd)* arrptr(int i)
{ if(i % 2) return &odd;
else return &even;
}
您可能对数组的命名方式感到困惑。函数 return 是一个指向数组的指针,具体取决于 i
的值(该函数对存储在数组中的数字一无所知)。也就是说,如果 i
是奇数,我们 return 指向名为 odd
的数组的指针,如果它 i
是偶数,我们 return 指向数组的指针名为 even
的数组。 i % 2
部分告诉您 i
是偶数还是奇数。希望这有帮助。
这是为了解释我在您发布到其他答案的评论中看到的困惑。
How does the conditional statement know the difference between what is a even number or an odd number?
没有。它只是计算第一个表达式并检查真值。与 if
一样,您插入决定 i
是偶数还是奇数的逻辑。通常这是通过整数提醒运算符 i % 2
.
The expressions in the conditional statement are nothing more than references to an array named &odd[] and &even[]. There is nothing in the program that tells the program what even or odd number means.
不是,第二个和第三个参数就是&odd[]
和&even[]
。你错过了第一个;它是一个条件表达式,将计算真值。
i % 2
将 return 0
如果 i
是偶数,否则 1
如果 i
是奇数。该整数值将隐式转换为布尔值,因为表达式是在布尔上下文中计算的。在 C 和 C++ 中,任何非零值都是 true else false。因此,如果 i
是偶数,它将 return false,否则 true.
我认为让您感到困惑的是操作数 2 和 3 的名称;在心里将它们重命名为 evenArray
和 oddArray
。运算符所做的是,它 returns 是一个数组。哪个数组?它根据第一个操作数决定,而第一个操作数又决定它与参数 i
.