调用在condintion中实际不存在的东西是否正确。
我正在使用if语句来检查两个条件,但是对于第一次迭代,其中一个被调用的参数不存在。但是程序运行正常,但它仍然正确吗?
程序获取全名并将第一个首字母转换为大写并打印出来。
int main(void) {
string fullname = GetString();
for (int i = 0, n = strlen(fullname); i < n; i++) {
if (fullname[i] != ' ' && fullname[i-1] == ' ' ) {
printf("%c", toupper(fullname[i]));
}
}
printf("\n");
return 0;
}
答案 0 :(得分:0)
简短回答:虽然有时运行良好但不正确。
对于&&
,如果fullname[i] != ' '
为false,则编译将不会检查fullname[i-1] == ' '
,因为false && whatever
将始终为false。这就是为什么它会正常运行有时。这就是所谓的Short-circuit evaluation。
但是,你应该避免在实践中编写这样的代码。当fullname[i] != ' '
为真时,它可能会导致错误。然后,它会评估fullname[i-1] == ' '
,即fullname[-1]
,这将触发 Access Violation at Address Error
。尝试将if
- 语句更改为以下内容:
if (fullname[i]!=' ' && i>0 && fullname[i-1]==' ') { // make it always right
答案 1 :(得分:0)
不,它不正确,可能导致程序崩溃。对于上面的代码,如果全名是,说“Fred”,那么你将检查全名[-1]。充其量,这将包含一个未定义的值 - 但如果全名恰好位于程序分配内存的边界,那么您将访问允许范围之外 - 因此程序崩溃。
只能访问您所知道的内容。
答案 2 :(得分:0)
你能不能尝试
for (int i = 1, n = strlen(fullname); i < n; i++) {
从偏移量1开始,除非字符串长度为1?