Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C初级读物加上第6章练习4_C_Runtime Error - Fatal编程技术网

C初级读物加上第6章练习4

C初级读物加上第6章练习4,c,runtime-error,C,Runtime Error,使用嵌套循环生成以下内容 A BC DEF GHIJ KLMNO PQRSTU 这是我到目前为止所拥有的。我最终得到了一个严重的运行时错误 #include <stdio.h> int main(void) { int row; char let; char ch = 'A'; for (row = 1; row <= 6; row++) { for (let = ch; let < (let + row); le

使用嵌套循环生成以下内容

A
BC
DEF
GHIJ
KLMNO
PQRSTU
这是我到目前为止所拥有的。我最终得到了一个严重的运行时错误

#include <stdio.h>

int main(void) {

    int row;
    char let;
    char ch = 'A';

    for (row = 1; row <= 6; row++) {

        for (let = ch; let < (let + row); let++) {

            printf("%c", let);

        }

        ch = let;
        printf("\n");

    }

    return 0;
}
#包括
内部主(空){
int行;
煤焦;
char ch='A';

对于(row=1;row你的循环永远不会因为条件而中断
let<(let+row);
总是正确的!例如提示:你的循环怎么能
1

你的循环永远不会因为条件
let<(let+row);
总是正确的!例如提示:怎么能
1

是这个位

let < (let + row)
let<(let+行)
永远都是真的吗?

这是真的吗

let < (let + row)
let<(let+行)
永远是真的吗?

改变

for (let = ch; let < (let + row); let++)
for(let=ch;let<(let+row);let++)

for(let=ch;let<(ch+行);let++)
否则,您将得到一个无限循环,因为
let<(let+row)
永远不会为false。这可能因编译器而异。C标准没有指定
let
无符号字符还是
有符号字符
。因此,这取决于编译器

如果
let
无符号字符
,则循环将循环,最后,
(let+row)
将(由于溢出)环绕到值0,然后循环结束。
如果
let
是一个
有符号字符
,那么最终,
(let+row)
将溢出并可以保存任何值。这会导致未定义的行为,无法保证循环是否结束。

更改

for (let = ch; let < (let + row); let++)
for(let=ch;let<(let+row);let++)

for(let=ch;let<(ch+行);let++)
否则,您将得到一个无限循环,因为
let<(let+row)
永远不会为false。这可能因编译器而异。C标准没有指定
let
无符号字符还是
有符号字符
。因此,这取决于编译器

如果
let
无符号字符
,则循环将循环,最后,
(let+row)
将(由于溢出)环绕到值0,然后循环结束。
如果
let
是一个
signed char
,那么最终,
(let+row)
将溢出并可以保存任何值。这将导致未定义的行为,并且无法保证循环是否结束。

更改为

for (let = 0; let <  row; let++) {
    printf("%c", ch + let);
}
ch += let;
for(let=0;let
更改为

for (let = 0; let <  row; let++) {
    printf("%c", ch + let);
}
ch += let;
for(let=0;let
@segarci,OP提到他有一个运行时error@CoolGuy-运行时错误有很多特点“此时不确定该做什么”-调试将是一个很好的开始。这一次你甚至不需要正式的调试器。一支铅笔、一张纸和三列将很快显示轮子从哪里掉下来。@EdHeal,你的意思是一旦出现运行时错误,任何事情都可能发生?@Coolgay-我没有这么说。运行时错误可能是内存不足、堆栈溢出、浮动点溢出,内存泄漏,。@segarci,OP提到他有一个运行时error@CoolGuy-运行时错误有很多特点“此时不确定该做什么”-调试将是一个很好的开始。这一次你甚至不需要正式的调试器。一支铅笔、一张纸和三列将很快显示轮子从哪里掉下来。@EdHeal,你的意思是一旦出现运行时错误,任何事情都可能发生?@Coolgay-我没有这么说。运行时错误可能是内存不足、堆栈溢出、浮动点溢出、内存泄漏等。您应该详细说明OP问题。您应该详细说明OP问题。这取决于他的编译器是否提供有符号或无符号
char
类型。C标准没有指定。这取决于他的编译器是否提供有符号或无符号
char
类型。C标准没有指定fy.这取决于他的编译器提供的是有符号的还是无符号的
char
类型。C标准没有指定。这取决于他的编译器提供的是有符号的还是无符号的
char
类型。C标准没有指定。这取决于他的编译器提供的是有符号的还是无符号的
char
类型esn不指定。@BenVoigt,因此如果
let
是一个
unsigned char
,那么循环将很快结束,如果
let
signed
,那么它将是UB?这取决于他的编译器提供的是有符号的还是无符号的
char
类型。C标准没有指定。@BenVoigt,所以如果
let
是一个
un签名字符
,那么循环将很快结束,如果
let
签名的
,那么它将是UB?