调用在条件中不存在的东西

时间:2014-01-16 03:28:59

标签: if-statement conditional-statements statements

调用在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;
}

3 个答案:

答案 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?