亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 百度看見一題,同求解 [打印本頁]

作者: FaintKnowledge    時(shí)間: 2012-10-12 17:44
標(biāo)題: 百度看見一題,同求解
本帖最后由 FaintKnowledge 于 2012-10-12 17:48 編輯

i=0;
while(i<n)
y=x[i++];

錯(cuò)在哪里?

多謝多謝!

調(diào)試信息:
  1. 1       #include "stdlib.h"
  2. 2       #include "stdio.h"
  3. 3
  4. 4       int main() {
  5. 5        int a[5]={1,2,3,4,5};
  6. 6        int y[5];
  7. 7        int i,n=5;
  8. 8        i=0;
  9. 9        while (i < n)
  10. 10       {   y[i] = a[i++];
  11. (gdb) l
  12. 11         printf("%d",y[i]);
  13. 12      }
  14. 13      
  15. 14      }
  16. (gdb) break 11
  17. Breakpoint 1 at 0x804843c: file simpl.c, line 11.
  18. (gdb) break 10
  19. Breakpoint 2 at 0x8048427: file simpl.c, line 10.
  20. (gdb) break 12
  21. Breakpoint 3 at 0x804845f: file simpl.c, line 12.
  22. (gdb) run
  23. Starting program: /root/a.out

  24. Breakpoint 2, main () at simpl.c:10
  25. 10       {   y[i] = a[i++];
  26. (gdb) print y[0];
  27. Invalid character ';' in expression.
  28. (gdb) print y[0]
  29. $1 = -1209687642
  30. (gdb) print a[i]
  31. $2 = 1
  32. (gdb) print i
  33. $3 = 0
  34. (gdb) print a[i++]
  35. $4 = 1
  36. (gdb) print y[0]
  37. $5 = -1209687642
復(fù)制代碼
原文地址:http://zhidao.baidu.com/question/486211476.html
作者: db1984    時(shí)間: 2012-10-12 18:17
y[i] = a[i++];
作者: hunter_search    時(shí)間: 2012-10-12 19:00
數(shù)組越界了....
作者: ethantsien    時(shí)間: 2012-10-12 20:26
2樓正解,一個(gè)表達(dá)式里面的變量或者函數(shù)參數(shù)的求值順序是“未定義的行為”,c里面“未定義的行為”就是錯(cuò)誤,即使有些編譯器能正確編譯
作者: FaintKnowledge    時(shí)間: 2012-10-13 09:31
回復(fù) 4# ethantsien


你說的這個(gè)未定義怎么理解?什么意思?
作者: bruceteen    時(shí)間: 2012-10-13 09:35
google 序列點(diǎn)
作者: 2007robot    時(shí)間: 2012-10-13 11:21
這個(gè)是否可以詳細(xì)講一下,THS!
回復(fù) 4# ethantsien


   
作者: ethantsien    時(shí)間: 2012-10-13 21:07
2007robot 發(fā)表于 2012-10-13 11:21
這個(gè)是否可以詳細(xì)講一下,THS!
回復(fù) 4# ethantsien


就是說C標(biāo)準(zhǔn)沒有定義這個(gè)行為,C標(biāo)準(zhǔn)把它的具體實(shí)現(xiàn)交給了編譯器,所以說,這種未定義的行為不具有可移植性,即使有些編譯器能夠編譯通過。
作者: captivated    時(shí)間: 2012-10-13 22:35
本帖最后由 captivated 于 2012-10-13 22:49 編輯

你妹, 編輯掉. 確實(shí)是未定義行為. 擦.
作者: starwing83    時(shí)間: 2012-10-14 01:19
回復(fù) 9# captivated


    你把我召喚過來又編輯掉了………………好吧,算了,我大概猜到你想說啥。進(jìn)步了哈,學(xué)會(huì)編輯了……


我個(gè)人建議,別完全刪掉,前頭加一段,然后后面留著我們鑒賞一下,而且這個(gè)態(tài)度也更坦誠~~
作者: 2007robot    時(shí)間: 2012-10-14 10:57
#include "stdlib.h"
#include "stdio.h"

int main()
        {
        int a[5]={1,2,3,4,5};

        int y[5];
        int i=0,n=5;
       
        while (i < n)
        {   
                //y[i] = a[i++];
                y[i] = a[i];
                printf("%d\n",y[i++]);
        }
}

如上可以避免數(shù)組越界.

這個(gè)題目的確好,正如 ethantsien 所講,未定義的行為不具有可移植性,即使有些編譯器(VC 2010 Express) 能夠編譯通過。
作者: captivated    時(shí)間: 2012-10-14 16:13
本帖最后由 captivated 于 2012-10-14 16:26 編輯

回復(fù) 10# starwing83


    sorry.

    一開始真的糾結(jié)了下. 搞了一大段發(fā)表后果斷發(fā)現(xiàn)自己搞錯(cuò)了.
    我原來的意思就是說
  1. y[i] = x[i++];
復(fù)制代碼
這樣的語句不是未定義行為, 因?yàn)槲彝ǔE袛辔炊x行為的依據(jù)是“序列點(diǎn)之間不能對同一變量修改兩次及以上”. 然后直接跟到LZ的帖子鏈接里面去看, C陷阱中講得清楚是未定義行為, 因?yàn)檫@個(gè)語句依賴 i 的求值順序.
    由于序列點(diǎn)之前所有副作用都已經(jīng)發(fā)生, 序列點(diǎn)之后所有副作用都尚未開始, 所以這個(gè)語句中是不能依賴i的求值順序的.

    我使用的那種簡單的判定方式雖然大部分情況下有效, 不過真正的判定還是應(yīng)該從序列點(diǎn)本身的定義出發(fā). 呃, 既然已經(jīng)@過來了, 那就再批我一次得了(就是如果我現(xiàn)在對序列點(diǎn)還有認(rèn)知上的錯(cuò)誤的話), 哈哈
作者: starwing83    時(shí)間: 2012-10-14 20:17
回復(fù) 12# captivated


    沒啥錯(cuò)誤,歸結(jié)為一句話,就是“在兩個(gè)序列點(diǎn)之間,一個(gè)object只能被改變一次,并且他出現(xiàn)的話,必定是為了獲取他自己的新值而出現(xiàn)的”。

意思是,如果object出現(xiàn)了多次而且改變了,那么object的出現(xiàn)一定是為了獲取被改變的那個(gè)值,除此以外是UB。
作者: OwnWaterloo    時(shí)間: 2012-10-15 14:54
回復(fù) 12# captivated

我也被召喚過來了。。。  叔叔,我白給你pm那一段了啊。。。
作者: koolcoy    時(shí)間: 2012-10-15 19:05
這到底是undefined還是implementation-defined的?
作者: 2007robot    時(shí)間: 2012-10-15 19:33
本帖最后由 2007robot 于 2012-10-15 19:34 編輯

  1. y[i] = a[i];
復(fù)制代碼
這是可以的,等號(hào)兩邊序列點(diǎn)是同時(shí)改變的啊!


回復(fù) 12# captivated


   
作者: wangzhen11aaa    時(shí)間: 2012-10-15 20:09
回復(fù) 13# starwing83

我看到編譯原理 p65頁:
將函數(shù)rvalue 應(yīng)用于 a = 2 * a[j - k]
的語法樹時(shí),將生成
t3 = j - k
t2 = a[ t3 ]
t1 = 2 * t2
a = t1.

如果是a = a[ i++] 的話,也應(yīng)該有差不多的分解吧。

你們所指的 “序列點(diǎn)”是c語言本身的問題,還是由于編譯器優(yōu)化造成的未定義行為。
   
作者: 你還未夠水準(zhǔn)呢    時(shí)間: 2012-10-16 09:34
value ? value++ : value--;
作者: lin5161678    時(shí)間: 2012-10-16 09:36
2007robot 發(fā)表于 2012-10-15 19:33
這是可以的,等號(hào)兩邊序列點(diǎn)是同時(shí)改變的啊!

回復(fù) 12# captivated

~~~~~ 新鮮的新人 還熱乎著 各位有興趣調(diào)教么
作者: 你還未夠水準(zhǔn)呢    時(shí)間: 2012-10-16 09:40
printf("%d %d\n", x++,  x++);
是UB么
作者: _Rayx    時(shí)間: 2012-10-16 09:47
為啥是百度看見一題?百度哪有題看?
作者: FaintKnowledge    時(shí)間: 2012-10-17 11:45
回復(fù) 21# _Rayx


    寫錯(cuò)了:一提
作者: 2007robot    時(shí)間: 2012-10-17 21:06
雖然被罵了,但還是THS,已理解,如下有資料,供大家參考:

http://kimva.blogbus.com/logs/19148550.html

看完這個(gè),一切釋然!

回復(fù) 19# lin5161678


   
作者: folklore    時(shí)間: 2012-10-17 21:20
回復(fù) 20# 你還未夠水準(zhǔn)呢


    這個(gè)說不好,不好說。。。
不是UB的可能性大的說,因?yàn)镃要支持printf(char *,...);
所以,后面的先被求值
x=0;
printf("%d,%d",x++,x++);
應(yīng)當(dāng)輸出1,0
不過,不想但C標(biāo)準(zhǔn)了。
作者: pandaiam    時(shí)間: 2012-10-18 11:15
本帖最后由 pandaiam 于 2012-10-18 11:17 編輯
你還未夠水準(zhǔn)呢 發(fā)表于 2012-10-16 09:40
printf("%d %d\n", x++,  x++);
是UB么


@starwing83
這個(gè)應(yīng)該不是ub吧
  1. printf("%d", (x++)*(x++));
  2. printf("%d",  x*(x++));
  3. printf("%d", (x++)*x);
復(fù)制代碼
這種都是UB?
作者: cbs612537    時(shí)間: 2012-10-18 12:04
6       int y[5];                 //定義了數(shù)組,卻沒初始化,y中的5個(gè)元素的值都是不可知的,也就是未定義

10     y[i] = a[i++];         //這條語句執(zhí)行完之后,i 就會(huì)自增

11     printf("%d",y[i]);   //由于i 進(jìn)行了自增,原來想輸出y[0] 就會(huì)變成輸出y[1]。而y[1]是未定義的,所以錯(cuò)誤。
作者: lin5161678    時(shí)間: 2012-10-18 13:57
回復(fù) 25# pandaiam
  1. printf("%d", (x++)*(x++));

  2. printf("%d",  x*(x++));

  3. printf("%d", (x++)*x);
復(fù)制代碼
這個(gè)幾個(gè)都是UB的
作者: FaintKnowledge    時(shí)間: 2012-10-18 14:43
本帖最后由 FaintKnowledge 于 2012-10-18 14:45 編輯

回復(fù) 26# cbs612537


看了半天終于找著個(gè)能看明白的...
如果是y [ i ] = a [+ + i ] 呢?
好像還是編譯不過去
作者: FaintKnowledge    時(shí)間: 2012-10-18 14:48
回復(fù) 27# lin5161678


    UB 是什么?沒聽說過...
作者: lin5161678    時(shí)間: 2012-10-18 15:27
回復(fù) 26# cbs612537


    1 沒初始化 值未知是對的 但是 只有你不讀這個(gè)未知的數(shù)據(jù) 就不是 未定義行為
   2 華麗麗的未定義行為 i++ 的副作用什么時(shí)候完成無法確定 賦值符號(hào) 左邊的表達(dá)式 先求值 還是 右邊的表達(dá)式 先求值 這個(gè)是不確定的
   3 這個(gè)你說對了

作者: lin5161678    時(shí)間: 2012-10-18 15:28
回復(fù) 29# FaintKnowledge


    未定義行為





歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2