为什么我的 C 程序会跳过这个 if 语句?
Why is my C program skipping over this if statement?
我有这个 C 程序,是我在 Code Composer Studio 中编写的。
#include <msp430.h>
/*
* main.c
*/
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
int R5_SW=0, R6_LED=0, temp=0;
P1OUT = 0b00000000; // mov.b #00000000b,&P1OUT
P1DIR = 0b11111111; // mov.b #11111111b,&P1DIR
P2DIR = 0b00000000; // mov.b #00000000b,&P2DIR
while (1)
{
// read all switches and save them in R5_SW
R5_SW = P2IN;
// check for read mode
if (R5_SW & BIT0)
{
R6_LED = R5_SW & (BIT3 | BIT4 | BIT5); // copy the pattern from the switches and mask
P1OUT = R6_LED; // send the pattern out
}
// display rotation mode
else
{
R6_LED = R5_SW & (BIT3|BIT4|BIT5);
// check for direction
if (R5_SW & BIT1) {// rotate left
R6_LED << 1;
} else {
R6_LED >> 1;
} // rotate right
// mask any excessive bits of the pattern and send it out
R6_LED &= 0xFF; // help clear all bits beyound the byte so when you rotate you do not see garbage coming in
P1OUT = R6_LED;
// check for speed
if (R5_SW & BIT2) {__delay_cycles( 40000); } //fast
else {__delay_cycles(100000); } //slow
}
}
}
当在调试模式下执行 if 语句时
if (R5_SW & BIT1) {// rotate left
R6_LED << 1;
} else {
R6_LED >> 1;
} // rotate right
它会跳过它,不会 运行 if 或 else 块。此时代码中的 R5_SW
是 22
,它是二进制的 0010 0010
,所以 R5_SW & BIT1
应该计算为真。我在这里错过了什么?
如果您使用 <<
或 >>
之类的操作而不分配它,那么结果将被丢弃。试试这个:
if (R5_SW & BIT1) {// rotate left
R6_LED = R6_LED << 1;
} else {
R6_LED = R6_LED >> 1;
} // rotate right
或者,为简洁起见:
if (R5_SW & BIT1) {// rotate left
R6_LED <<= 1;
} else {
R6_LED >>= 1;
} // rotate right
这段代码...
if (R5_SW & BIT1) {// rotate left
R6_LED << 1;
} else {
R6_LED >> 1;
} // rotate right
计算表达式 R6_LED >> 1
或表达式 R6_LED << 1
但它不会对其结果执行任何操作,因此编译器选择将其丢弃整个 IF 语句。
a>>b
等行本身不会修改 a
。它不像 a++
那样修改 a
.
我有这个 C 程序,是我在 Code Composer Studio 中编写的。
#include <msp430.h>
/*
* main.c
*/
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
int R5_SW=0, R6_LED=0, temp=0;
P1OUT = 0b00000000; // mov.b #00000000b,&P1OUT
P1DIR = 0b11111111; // mov.b #11111111b,&P1DIR
P2DIR = 0b00000000; // mov.b #00000000b,&P2DIR
while (1)
{
// read all switches and save them in R5_SW
R5_SW = P2IN;
// check for read mode
if (R5_SW & BIT0)
{
R6_LED = R5_SW & (BIT3 | BIT4 | BIT5); // copy the pattern from the switches and mask
P1OUT = R6_LED; // send the pattern out
}
// display rotation mode
else
{
R6_LED = R5_SW & (BIT3|BIT4|BIT5);
// check for direction
if (R5_SW & BIT1) {// rotate left
R6_LED << 1;
} else {
R6_LED >> 1;
} // rotate right
// mask any excessive bits of the pattern and send it out
R6_LED &= 0xFF; // help clear all bits beyound the byte so when you rotate you do not see garbage coming in
P1OUT = R6_LED;
// check for speed
if (R5_SW & BIT2) {__delay_cycles( 40000); } //fast
else {__delay_cycles(100000); } //slow
}
}
}
当在调试模式下执行 if 语句时
if (R5_SW & BIT1) {// rotate left
R6_LED << 1;
} else {
R6_LED >> 1;
} // rotate right
它会跳过它,不会 运行 if 或 else 块。此时代码中的 R5_SW
是 22
,它是二进制的 0010 0010
,所以 R5_SW & BIT1
应该计算为真。我在这里错过了什么?
如果您使用 <<
或 >>
之类的操作而不分配它,那么结果将被丢弃。试试这个:
if (R5_SW & BIT1) {// rotate left
R6_LED = R6_LED << 1;
} else {
R6_LED = R6_LED >> 1;
} // rotate right
或者,为简洁起见:
if (R5_SW & BIT1) {// rotate left
R6_LED <<= 1;
} else {
R6_LED >>= 1;
} // rotate right
这段代码...
if (R5_SW & BIT1) {// rotate left
R6_LED << 1;
} else {
R6_LED >> 1;
} // rotate right
计算表达式 R6_LED >> 1
或表达式 R6_LED << 1
但它不会对其结果执行任何操作,因此编译器选择将其丢弃整个 IF 语句。
a>>b
等行本身不会修改 a
。它不像 a++
那样修改 a
.