我对C Code相对较新,并试图解释这些C线的结果正在进行一些投射。
ASS_CODE是一个最多4个字符的字符串,可能是数字也可能不是数字,ASCII_ZERO是一个定义为48的常量,而ASCII_ONE是一个定义为49的常量。我猜这是试图强制某种类型根据ASS_CODE是数字还是其他方式的真或假结果,或者测试字符串是'0'还是'1',但不完全确定
if ((int)(*ASS_CODE) == ASCII_ZERO)
{
calc_SDIS_EL13();
}
else if ((int)(*ASS_CODE) == ASCII_ONE)
{
do_gn11();
} else
{
........
}
}
答案 0 :(得分:3)
char
*ASS_CODE
与char
一样,是签名char
或无签名int
比int
更窄(其中1个几乎总是如此) )将被提升为48
。 整数常量 int
的类型为(int)
,因此无需使用强制转换char
。
在罕见的平台上,*ASS_CODE
与char
一样,int/unsigned
与*ASS_CODE
一样宽。unsigned
。作为待处理比较操作的一部分,unsigned
被提升为48
。将int
与整数常量 int
(unsigned
)进行比较可能会警告您将bq partition mydataset.sharded_ mydataset.partitioned
与let term = termTextField.text!
let answer = answerTextField.text!
termAnswer.append((term,answer))
print(termAnswer.self)
let newTA = CKRecord(recordType: "Terms")
newTA["answers"] = answer as CKRecordValue?
var publicData = CKContainer.default().publicCloudDatabase
publicData.save(newTA, completionHandler: {(record, error) -> Void in
if error == nil{
print("TA Saved")
}
else{
print("Not Saved")
}
})
newTA["terms"] = term as CKRecordValue?
publicData = CKContainer.default().publicCloudDatabase
publicData.save(newTA, completionHandler: {(record, error) -> Void in
if error == nil{
print("TA Saved")
}
else{
print("Not Saved")
}
})
进行比较。在这种情况下演员将安静警告。
答案 1 :(得分:0)
char ASS_CODE[4] = { ... };
#define ASCII_ZERO 48
if ((int)(*ASS_CODE) == ASCII_ZERO)
显然,这是非ASCII执行字符集的代码,或者是非常小心的开发人员。否则,ASCII_ZERO
常量将不是必需的。
我首先想到的是char
类型在该平台上等于unsigned char
,并且需要使用强制转换来抑制编译器警告。但无论我如何定义常量,GCC都不会忽略任何警告。我试过这个:
enum { ASCII_ZERO = 48 };
void x() {
char ASS_CODE[4] = {0};
if (ASS_CODE[0] == ASCII_ZERO) {} else {}
}
下一个想法是代码必须符合某些行业标准,如MISRA。该标准可能要求每个二元运算符的左侧和右侧必须具有相同的类型。由于48具有类型int
,因此必须将该字符强制转换为该类型。
答案 2 :(得分:0)
我试图解释正在进行某些演员的这些C行的结果。
[...] ASS_CODE是一个最多4个字符的字符串,可能是数字也可能不是数字,ASCII_ZERO是一个定义为48的常量
[...]
if ((int)(*ASS_CODE) == ASCII_ZERO)
如果某个ASS_CODE
的{{1}}类型为char *
或类型为char[n]
,则n
的类型为*ASSCODE
,并评估为相同作为char
- ie 的东西,字符串的第一个字符。宏ASS_CODE[0]
展开的文字48
表示类型ASCII_ZERO
的值;具体来说,它是ASCII兼容字符编码中int
字符的值。
强制转换运算符的优先级高于'0'
运算符,因此在评估条件时,==
(a *ASS_CODE
)的值首先转换为char
类型,然后与右手操作数(已经是int
)进行比较。当int
的第一个字符是数字1
时(假设与ASCII兼容的编码),条件评估为ASS_CODE
(true)。可以想象使用'0'
而不是字符文字(ASCII_ZERO
),因为即使在使用不同的字符编码时,也需要特别与 ASCII 0的意义进行比较。使用。无论如何,这就是产生的效果。
我推测,强制转换的原因是要使两个操作数具有相同的类型,或者只是强调比较是在'0'
值上执行的。然而,它对程序的语义没有任何影响,因为int
运算符的操作数无论如何都要在运算被评估之前进行“通常的算术转换”,在这种情况下,这将涉及转换即使没有显式演员,左手操作数也会==
。