与 printf 中的序列点一起使用时 i 的未定义值
undefined value of i when used with sequence point in printf
我在看序列点操作。在下面的代码中,i 的值打印为 1。但是我收到 "Operation on i is undefined" 的警告消息。我在想虽然 & 运算符不是一个序列点,但是函数调用 printf 被认为是一个序列点,因此 i 在 %d 期间被完全评估。但为什么操作未定义?
int i = 0;
if((i++) & printf("i = %d\n",i))
{
// Something
}
else
{
// some code here
}
函数调用是一个序列点,但函数的参数在函数调用之前被评估。因此 i++
和 i
作为 printf 的参数是无序的。
关于:
if((i++) & printf("i = %d\n",i))
这是两个表达式的位与运算,其中一个是printf()
的返回值
建议使用:
if((i++) && printf("i = %d\n",i))
这是合乎逻辑的 'and'
此外,对于'i'打印时的值还有一些疑问。建议:
if( i && printf("i = %d\n",i))
i++;
这将实现您的问题的逻辑,以下评论表明是所需的逻辑。
注意:在您的代码中使用 'side effects'(通常)不是一个好主意。
我在看序列点操作。在下面的代码中,i 的值打印为 1。但是我收到 "Operation on i is undefined" 的警告消息。我在想虽然 & 运算符不是一个序列点,但是函数调用 printf 被认为是一个序列点,因此 i 在 %d 期间被完全评估。但为什么操作未定义?
int i = 0;
if((i++) & printf("i = %d\n",i))
{
// Something
}
else
{
// some code here
}
函数调用是一个序列点,但函数的参数在函数调用之前被评估。因此 i++
和 i
作为 printf 的参数是无序的。
关于:
if((i++) & printf("i = %d\n",i))
这是两个表达式的位与运算,其中一个是printf()
建议使用:
if((i++) && printf("i = %d\n",i))
这是合乎逻辑的 'and'
此外,对于'i'打印时的值还有一些疑问。建议:
if( i && printf("i = %d\n",i))
i++;
这将实现您的问题的逻辑,以下评论表明是所需的逻辑。
注意:在您的代码中使用 'side effects'(通常)不是一个好主意。